{"cells": [{"cell_type": "markdown", "metadata": {}, "source": ["# Optimisation de code avec cffi, numba, cython\n", "\n", "L'id\u00e9e est de recoder une fonction en C. On prend comme exemple la fonction de pr\u00e9diction de la r\u00e9gression lin\u00e9aire de [scikit-learn](http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html) et de pr\u00e9voir le gain de temps qu'on obtient en recodant la fonction dans un langage plus rapide."]}, {"cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [{"data": {"text/html": ["
\n", ""], "text/plain": ["\n", " | average | \n", "deviation | \n", "first | \n", "first3 | \n", "last3 | \n", "repeat | \n", "min5 | \n", "max5 | \n", "code | \n", "run | \n", "
---|---|---|---|---|---|---|---|---|---|---|
legend | \n", "\n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " |
cffi-linreg-custom-float32 | \n", "3.891910e-07 | \n", "2.267541e-07 | \n", "5.608000e-06 | \n", "2.196000e-06 | \n", "3.763333e-07 | \n", "1000 | \n", "3.170000e-07 | \n", "5.770000e-07 | \n", "linreg_custom_float(cptr_x, cptr_out) | \n", "100 | \n", "
cffi-linreg-custom-float32-simd | \n", "4.189890e-07 | \n", "3.871792e-07 | \n", "1.091200e-05 | \n", "3.949667e-06 | \n", "2.996667e-07 | \n", "1000 | \n", "2.990000e-07 | \n", "6.310000e-07 | \n", "linreg_custom_float_simd(cptr_x, cptr_out) | \n", "100 | \n", "
cffi-linreg-custom | \n", "4.665150e-07 | \n", "8.519581e-07 | \n", "2.679900e-05 | \n", "9.352667e-06 | \n", "3.256667e-07 | \n", "1000 | \n", "3.150000e-07 | \n", "7.150000e-07 | \n", "linreg_custom(cptr_x, cptr_out) | \n", "100 | \n", "
numba-linreg-type-float32 | \n", "7.070790e-07 | \n", "2.686359e-07 | \n", "1.162000e-06 | \n", "1.083333e-06 | \n", "5.663333e-07 | \n", "1000 | \n", "5.650000e-07 | \n", "1.249000e-06 | \n", "predict_clr_numba_cast_float(x32, c32, i32) | \n", "100 | \n", "
cython-linreg-type | \n", "7.213150e-07 | \n", "3.991047e-07 | \n", "1.252000e-06 | \n", "8.300000e-07 | \n", "5.513333e-07 | \n", "1000 | \n", "5.330000e-07 | \n", "1.443000e-06 | \n", "predict_clr_cython_type(x[0], clr.coef_, clr.i... | \n", "100 | \n", "
numba-linreg-type-custom | \n", "8.243540e-07 | \n", "3.713608e-07 | \n", "7.940000e-07 | \n", "7.156667e-07 | \n", "6.543333e-07 | \n", "1000 | \n", "6.520000e-07 | \n", "1.558000e-06 | \n", "predict_clr_numba_cast_custom(x[0]) | \n", "100 | \n", "
cffi-linreg | \n", "8.313670e-07 | \n", "7.080831e-07 | \n", "6.414000e-06 | \n", "3.244000e-06 | \n", "4.170000e-07 | \n", "1000 | \n", "4.160000e-07 | \n", "1.519000e-06 | \n", "lib.linreg(n, cptr_x, cptr_coef, clr.intercept... | \n", "100 | \n", "
numba-linreg-type | \n", "9.482040e-07 | \n", "4.114651e-07 | \n", "9.350000e-07 | \n", "8.663333e-07 | \n", "7.596667e-07 | \n", "1000 | \n", "7.590000e-07 | \n", "1.678000e-06 | \n", "predict_clr_numba_cast(x[0], clr.coef_, clr.in... | \n", "100 | \n", "
python-linreg-custom | \n", "2.018942e-06 | \n", "6.704544e-07 | \n", "5.511000e-06 | \n", "4.254667e-06 | \n", "1.703667e-06 | \n", "1000 | \n", "1.696000e-06 | \n", "2.731000e-06 | \n", "predict_clr_python(z) | \n", "100 | \n", "
cython-linreg | \n", "2.706254e-06 | \n", "1.597806e-06 | \n", "5.083000e-06 | \n", "5.419333e-06 | \n", "2.126000e-06 | \n", "1000 | \n", "1.920000e-06 | \n", "7.194000e-06 | \n", "predict_clr_cython(x[0], clr.coef_, clr.interc... | \n", "100 | \n", "
python-linreg | \n", "3.539523e-06 | \n", "1.306156e-06 | \n", "8.761000e-06 | \n", "7.510000e-06 | \n", "2.779667e-06 | \n", "1000 | \n", "2.681000e-06 | \n", "6.164000e-06 | \n", "predict_clr_python_loop(z, coef, intercept) | \n", "100 | \n", "
cffi-linreg-custom-float wrapped | \n", "5.123886e-06 | \n", "1.598363e-06 | \n", "1.200400e-05 | \n", "1.176767e-05 | \n", "4.483000e-06 | \n", "1000 | \n", "4.477000e-06 | \n", "6.436000e-06 | \n", "predict_clr_custom(x32) | \n", "100 | \n", "
numba-linreg-type-numpy | \n", "5.147404e-06 | \n", "1.775723e-06 | \n", "1.874100e-05 | \n", "1.572433e-05 | \n", "4.474333e-06 | \n", "1000 | \n", "4.374000e-06 | \n", "5.996000e-06 | \n", "predict_clr_numba_numpy(x[0], clr.coef_, clr.i... | \n", "100 | \n", "
cffi-linreg-custom wrapped | \n", "5.274568e-06 | \n", "1.823247e-06 | \n", "2.166200e-05 | \n", "2.268700e-05 | \n", "5.626667e-06 | \n", "1000 | \n", "4.422000e-06 | \n", "7.773000e-06 | \n", "predict_clr_custom(x) | \n", "100 | \n", "
cffi-linreg-wrapped | \n", "7.519599e-06 | \n", "2.343424e-06 | \n", "1.580000e-05 | \n", "2.028933e-05 | \n", "6.263333e-06 | \n", "1000 | \n", "6.201000e-06 | \n", "1.041900e-05 | \n", "predict_clr(x, clr) | \n", "100 | \n", "
numpy-linreg-numpy | \n", "8.081947e-06 | \n", "3.442724e-06 | \n", "3.679000e-05 | \n", "3.075167e-05 | \n", "6.525667e-06 | \n", "1000 | \n", "6.442000e-06 | \n", "1.216200e-05 | \n", "predict_clr_numpy(z, coef, clr.intercept_) | \n", "100 | \n", "
onnxruntime-float64 | \n", "1.269215e-05 | \n", "1.926911e-06 | \n", "1.742200e-05 | \n", "1.337233e-05 | \n", "1.133667e-05 | \n", "1000 | \n", "1.129500e-05 | \n", "1.623200e-05 | \n", "predict_onnxrt(x.astype(numpy.float32)) | \n", "100 | \n", "
onnxruntime-float32 | \n", "1.299773e-05 | \n", "7.686900e-06 | \n", "2.281400e-05 | \n", "1.689933e-05 | \n", "1.009533e-05 | \n", "1000 | \n", "9.713000e-06 | \n", "2.363700e-05 | \n", "predict_onnxrt(x32) | \n", "100 | \n", "
numba-linreg-notype | \n", "2.376539e-05 | \n", "7.362380e-06 | \n", "3.079800e-05 | \n", "2.445400e-05 | \n", "3.723367e-05 | \n", "1000 | \n", "1.998900e-05 | \n", "3.763900e-05 | \n", "predict_clr_numba(z, clr.coef_, clr.intercept_) | \n", "100 | \n", "
sklearn.predict | \n", "4.550096e-05 | \n", "6.337585e-06 | \n", "7.724200e-05 | \n", "6.447133e-05 | \n", "4.143867e-05 | \n", "1000 | \n", "4.087300e-05 | \n", "5.295400e-05 | \n", "clr.predict(z) | \n", "100 | \n", "
\n", " | average | \n", "deviation | \n", "min5 | \n", "max5 | \n", "run | \n", "code | \n", "
---|---|---|---|---|---|---|
legend | \n", "\n", " | \n", " | \n", " | \n", " | \n", " | \n", " |
cffi-linreg-custom-float32 | \n", "3.891910e-07 | \n", "2.267541e-07 | \n", "3.170000e-07 | \n", "5.770000e-07 | \n", "100 | \n", "linreg_custom_float(cptr_x, cptr_out) | \n", "
cffi-linreg-custom-float32-simd | \n", "4.189890e-07 | \n", "3.871792e-07 | \n", "2.990000e-07 | \n", "6.310000e-07 | \n", "100 | \n", "linreg_custom_float_simd(cptr_x, cptr_out) | \n", "
cffi-linreg-custom | \n", "4.665150e-07 | \n", "8.519581e-07 | \n", "3.150000e-07 | \n", "7.150000e-07 | \n", "100 | \n", "linreg_custom(cptr_x, cptr_out) | \n", "
numba-linreg-type-float32 | \n", "7.070790e-07 | \n", "2.686359e-07 | \n", "5.650000e-07 | \n", "1.249000e-06 | \n", "100 | \n", "predict_clr_numba_cast_float(x32, c32, i32) | \n", "
cython-linreg-type | \n", "7.213150e-07 | \n", "3.991047e-07 | \n", "5.330000e-07 | \n", "1.443000e-06 | \n", "100 | \n", "predict_clr_cython_type(x[0], clr.coef_, clr.i... | \n", "
numba-linreg-type-custom | \n", "8.243540e-07 | \n", "3.713608e-07 | \n", "6.520000e-07 | \n", "1.558000e-06 | \n", "100 | \n", "predict_clr_numba_cast_custom(x[0]) | \n", "
cffi-linreg | \n", "8.313670e-07 | \n", "7.080831e-07 | \n", "4.160000e-07 | \n", "1.519000e-06 | \n", "100 | \n", "lib.linreg(n, cptr_x, cptr_coef, clr.intercept... | \n", "
numba-linreg-type | \n", "9.482040e-07 | \n", "4.114651e-07 | \n", "7.590000e-07 | \n", "1.678000e-06 | \n", "100 | \n", "predict_clr_numba_cast(x[0], clr.coef_, clr.in... | \n", "
python-linreg-custom | \n", "2.018942e-06 | \n", "6.704544e-07 | \n", "1.696000e-06 | \n", "2.731000e-06 | \n", "100 | \n", "predict_clr_python(z) | \n", "
cython-linreg | \n", "2.706254e-06 | \n", "1.597806e-06 | \n", "1.920000e-06 | \n", "7.194000e-06 | \n", "100 | \n", "predict_clr_cython(x[0], clr.coef_, clr.interc... | \n", "
python-linreg | \n", "3.539523e-06 | \n", "1.306156e-06 | \n", "2.681000e-06 | \n", "6.164000e-06 | \n", "100 | \n", "predict_clr_python_loop(z, coef, intercept) | \n", "
cffi-linreg-custom-float wrapped | \n", "5.123886e-06 | \n", "1.598363e-06 | \n", "4.477000e-06 | \n", "6.436000e-06 | \n", "100 | \n", "predict_clr_custom(x32) | \n", "
numba-linreg-type-numpy | \n", "5.147404e-06 | \n", "1.775723e-06 | \n", "4.374000e-06 | \n", "5.996000e-06 | \n", "100 | \n", "predict_clr_numba_numpy(x[0], clr.coef_, clr.i... | \n", "
cffi-linreg-custom wrapped | \n", "5.274568e-06 | \n", "1.823247e-06 | \n", "4.422000e-06 | \n", "7.773000e-06 | \n", "100 | \n", "predict_clr_custom(x) | \n", "
cffi-linreg-wrapped | \n", "7.519599e-06 | \n", "2.343424e-06 | \n", "6.201000e-06 | \n", "1.041900e-05 | \n", "100 | \n", "predict_clr(x, clr) | \n", "
numpy-linreg-numpy | \n", "8.081947e-06 | \n", "3.442724e-06 | \n", "6.442000e-06 | \n", "1.216200e-05 | \n", "100 | \n", "predict_clr_numpy(z, coef, clr.intercept_) | \n", "
onnxruntime-float64 | \n", "1.269215e-05 | \n", "1.926911e-06 | \n", "1.129500e-05 | \n", "1.623200e-05 | \n", "100 | \n", "predict_onnxrt(x.astype(numpy.float32)) | \n", "
onnxruntime-float32 | \n", "1.299773e-05 | \n", "7.686900e-06 | \n", "9.713000e-06 | \n", "2.363700e-05 | \n", "100 | \n", "predict_onnxrt(x32) | \n", "
numba-linreg-notype | \n", "2.376539e-05 | \n", "7.362380e-06 | \n", "1.998900e-05 | \n", "3.763900e-05 | \n", "100 | \n", "predict_clr_numba(z, clr.coef_, clr.intercept_) | \n", "
sklearn.predict | \n", "4.550096e-05 | \n", "6.337585e-06 | \n", "4.087300e-05 | \n", "5.295400e-05 | \n", "100 | \n", "clr.predict(z) | \n", "
lib | \n", "cython | \n", "numba | \n", "numpy | \n", "onnxruntime | \n", "python | \n", "sklearn | \n", "
---|---|---|---|---|---|---|
batch | \n", "\n", " | \n", " | \n", " | \n", " | \n", " | \n", " |
1 | \n", "0.000002 | \n", "0.000002 | \n", "0.000012 | \n", "0.000019 | \n", "0.000006 | \n", "0.000062 | \n", "
10 | \n", "0.000010 | \n", "0.000011 | \n", "0.000019 | \n", "0.000020 | \n", "0.000101 | \n", "0.000074 | \n", "
100 | \n", "0.000067 | \n", "0.000094 | \n", "0.000011 | \n", "0.000091 | \n", "0.000740 | \n", "0.000069 | \n", "
200 | \n", "0.000102 | \n", "0.000168 | \n", "0.000012 | \n", "0.000018 | \n", "0.001590 | \n", "0.000069 | \n", "
500 | \n", "0.000263 | \n", "0.000411 | \n", "0.000014 | \n", "0.000022 | \n", "0.003225 | \n", "0.000064 | \n", "
1000 | \n", "0.000446 | \n", "0.000703 | \n", "0.000083 | \n", "0.000027 | \n", "0.005516 | \n", "0.000153 | \n", "
2000 | \n", "NaN | \n", "0.001580 | \n", "0.000084 | \n", "0.000047 | \n", "NaN | \n", "0.000148 | \n", "
3000 | \n", "NaN | \n", "0.002371 | \n", "0.000092 | \n", "0.000051 | \n", "NaN | \n", "0.000180 | \n", "
4000 | \n", "NaN | \n", "0.003125 | \n", "0.000100 | \n", "0.000065 | \n", "NaN | \n", "0.000193 | \n", "
5000 | \n", "NaN | \n", "0.003490 | \n", "0.000111 | \n", "0.000079 | \n", "NaN | \n", "0.000215 | \n", "
10000 | \n", "NaN | \n", "0.007181 | \n", "0.000117 | \n", "0.000153 | \n", "NaN | \n", "0.000249 | \n", "
20000 | \n", "NaN | \n", "NaN | \n", "0.000147 | \n", "0.000216 | \n", "NaN | \n", "0.000294 | \n", "
50000 | \n", "NaN | \n", "NaN | \n", "0.000503 | \n", "0.001863 | \n", "NaN | \n", "0.001000 | \n", "
75000 | \n", "NaN | \n", "NaN | \n", "0.000663 | \n", "0.001879 | \n", "NaN | \n", "0.001749 | \n", "
100000 | \n", "NaN | \n", "NaN | \n", "0.001209 | \n", "0.002980 | \n", "NaN | \n", "0.002557 | \n", "
150000 | \n", "NaN | \n", "NaN | \n", "0.002923 | \n", "0.003762 | \n", "NaN | \n", "0.004001 | \n", "
200000 | \n", "NaN | \n", "NaN | \n", "0.004001 | \n", "0.005440 | \n", "NaN | \n", "0.005731 | \n", "
300000 | \n", "NaN | \n", "NaN | \n", "0.005366 | \n", "0.007180 | \n", "NaN | \n", "0.008365 | \n", "
400000 | \n", "NaN | \n", "NaN | \n", "0.007872 | \n", "0.010510 | \n", "NaN | \n", "0.011489 | \n", "
500000 | \n", "NaN | \n", "NaN | \n", "0.011016 | \n", "0.017021 | \n", "NaN | \n", "0.015013 | \n", "
600000 | \n", "NaN | \n", "NaN | \n", "0.012468 | \n", "0.018040 | \n", "NaN | \n", "0.021193 | \n", "
lib | \n", "cython | \n", "numba | \n", "numpy | \n", "onnxruntime | \n", "python | \n", "sklearn | \n", "ave_cython | \n", "ave_numba | \n", "ave_numpy | \n", "ave_onnxruntime | \n", "ave_python | \n", "ave_sklearn | \n", "
---|---|---|---|---|---|---|---|---|---|---|---|---|
batch | \n", "\n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " |
1 | \n", "0.000002 | \n", "0.000002 | \n", "0.000012 | \n", "0.000019 | \n", "0.000006 | \n", "0.000062 | \n", "1.614900e-06 | \n", "1.990900e-06 | \n", "1.209790e-05 | \n", "1.938460e-05 | \n", "0.000006 | \n", "6.245340e-05 | \n", "
10 | \n", "0.000010 | \n", "0.000011 | \n", "0.000019 | \n", "0.000020 | \n", "0.000101 | \n", "0.000074 | \n", "1.046460e-06 | \n", "1.084320e-06 | \n", "1.906010e-06 | \n", "1.965810e-06 | \n", "0.000010 | \n", "7.396440e-06 | \n", "
100 | \n", "0.000067 | \n", "0.000094 | \n", "0.000011 | \n", "0.000091 | \n", "0.000740 | \n", "0.000069 | \n", "6.722760e-07 | \n", "9.431990e-07 | \n", "1.075410e-07 | \n", "9.127790e-07 | \n", "0.000007 | \n", "6.865190e-07 | \n", "
200 | \n", "0.000102 | \n", "0.000168 | \n", "0.000012 | \n", "0.000018 | \n", "0.001590 | \n", "0.000069 | \n", "5.104525e-07 | \n", "8.383455e-07 | \n", "5.827850e-08 | \n", "9.019900e-08 | \n", "0.000008 | \n", "3.440995e-07 | \n", "
500 | \n", "0.000263 | \n", "0.000411 | \n", "0.000014 | \n", "0.000022 | \n", "0.003225 | \n", "0.000064 | \n", "5.261610e-07 | \n", "8.217592e-07 | \n", "2.781740e-08 | \n", "4.455220e-08 | \n", "0.000006 | \n", "1.270610e-07 | \n", "
1000 | \n", "0.000446 | \n", "0.000703 | \n", "0.000083 | \n", "0.000027 | \n", "0.005516 | \n", "0.000153 | \n", "4.458687e-07 | \n", "7.027674e-07 | \n", "8.303090e-08 | \n", "2.747640e-08 | \n", "0.000006 | \n", "1.534708e-07 | \n", "
2000 | \n", "NaN | \n", "0.001580 | \n", "0.000084 | \n", "0.000047 | \n", "NaN | \n", "0.000148 | \n", "NaN | \n", "7.899395e-07 | \n", "4.185515e-08 | \n", "2.365645e-08 | \n", "NaN | \n", "7.386540e-08 | \n", "
3000 | \n", "NaN | \n", "0.002371 | \n", "0.000092 | \n", "0.000051 | \n", "NaN | \n", "0.000180 | \n", "NaN | \n", "7.902492e-07 | \n", "3.075760e-08 | \n", "1.689707e-08 | \n", "NaN | \n", "5.992867e-08 | \n", "
4000 | \n", "NaN | \n", "0.003125 | \n", "0.000100 | \n", "0.000065 | \n", "NaN | \n", "0.000193 | \n", "NaN | \n", "7.813673e-07 | \n", "2.501480e-08 | \n", "1.616818e-08 | \n", "NaN | \n", "4.825388e-08 | \n", "
5000 | \n", "NaN | \n", "0.003490 | \n", "0.000111 | \n", "0.000079 | \n", "NaN | \n", "0.000215 | \n", "NaN | \n", "6.979748e-07 | \n", "2.218220e-08 | \n", "1.577170e-08 | \n", "NaN | \n", "4.301210e-08 | \n", "
10000 | \n", "NaN | \n", "0.007181 | \n", "0.000117 | \n", "0.000153 | \n", "NaN | \n", "0.000249 | \n", "NaN | \n", "7.180820e-07 | \n", "1.165535e-08 | \n", "1.533050e-08 | \n", "NaN | \n", "2.487490e-08 | \n", "
20000 | \n", "NaN | \n", "NaN | \n", "0.000147 | \n", "0.000216 | \n", "NaN | \n", "0.000294 | \n", "NaN | \n", "NaN | \n", "7.356025e-09 | \n", "1.078465e-08 | \n", "NaN | \n", "1.469057e-08 | \n", "
50000 | \n", "NaN | \n", "NaN | \n", "0.000503 | \n", "0.001863 | \n", "NaN | \n", "0.001000 | \n", "NaN | \n", "NaN | \n", "1.006655e-08 | \n", "3.725768e-08 | \n", "NaN | \n", "2.000188e-08 | \n", "
75000 | \n", "NaN | \n", "NaN | \n", "0.000663 | \n", "0.001879 | \n", "NaN | \n", "0.001749 | \n", "NaN | \n", "NaN | \n", "8.845087e-09 | \n", "2.505991e-08 | \n", "NaN | \n", "2.331396e-08 | \n", "
100000 | \n", "NaN | \n", "NaN | \n", "0.001209 | \n", "0.002980 | \n", "NaN | \n", "0.002557 | \n", "NaN | \n", "NaN | \n", "1.208690e-08 | \n", "2.980086e-08 | \n", "NaN | \n", "2.556766e-08 | \n", "
150000 | \n", "NaN | \n", "NaN | \n", "0.002923 | \n", "0.003762 | \n", "NaN | \n", "0.004001 | \n", "NaN | \n", "NaN | \n", "1.948814e-08 | \n", "2.508106e-08 | \n", "NaN | \n", "2.667062e-08 | \n", "
200000 | \n", "NaN | \n", "NaN | \n", "0.004001 | \n", "0.005440 | \n", "NaN | \n", "0.005731 | \n", "NaN | \n", "NaN | \n", "2.000416e-08 | \n", "2.720136e-08 | \n", "NaN | \n", "2.865267e-08 | \n", "
300000 | \n", "NaN | \n", "NaN | \n", "0.005366 | \n", "0.007180 | \n", "NaN | \n", "0.008365 | \n", "NaN | \n", "NaN | \n", "1.788538e-08 | \n", "2.393301e-08 | \n", "NaN | \n", "2.788189e-08 | \n", "
400000 | \n", "NaN | \n", "NaN | \n", "0.007872 | \n", "0.010510 | \n", "NaN | \n", "0.011489 | \n", "NaN | \n", "NaN | \n", "1.967972e-08 | \n", "2.627497e-08 | \n", "NaN | \n", "2.872169e-08 | \n", "
500000 | \n", "NaN | \n", "NaN | \n", "0.011016 | \n", "0.017021 | \n", "NaN | \n", "0.015013 | \n", "NaN | \n", "NaN | \n", "2.203297e-08 | \n", "3.404131e-08 | \n", "NaN | \n", "3.002589e-08 | \n", "
600000 | \n", "NaN | \n", "NaN | \n", "0.012468 | \n", "0.018040 | \n", "NaN | \n", "0.021193 | \n", "NaN | \n", "NaN | \n", "2.077927e-08 | \n", "3.006664e-08 | \n", "NaN | \n", "3.532122e-08 | \n", "
\n", " | average | \n", "deviation | \n", "first | \n", "first3 | \n", "last3 | \n", "repeat | \n", "min5 | \n", "max5 | \n", "code | \n", "run | \n", "
---|---|---|---|---|---|---|---|---|---|---|
legend | \n", "\n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " |
onnx-rf | \n", "0.000014 | \n", "0.000004 | \n", "0.000047 | \n", "0.000027 | \n", "0.000014 | \n", "100 | \n", "0.000012 | \n", "0.000022 | \n", "predict_onnxrt_rf(x.astype(numpy.float32)) | \n", "20 | \n", "
sklearn-rf | \n", "0.000980 | \n", "0.000061 | \n", "0.001308 | \n", "0.001087 | \n", "0.001075 | \n", "100 | \n", "0.000938 | \n", "0.001106 | \n", "rf.predict(x) | \n", "20 | \n", "