Note
Go to the end to download the full example code
Compares filtering implementations (numpy, cython)¶
The benchmark looks into different ways to implement thresholding: every value of a vector superior to mx is replaced by mx. It compares several implementation to numpy.
import pprint
import numpy
import matplotlib.pyplot as plt
from pandas import DataFrame
from td3a_cpp.tutorial.experiment_cython import (
pyfilter_dmax, filter_dmax_cython,
filter_dmax_cython_optim,
cyfilter_dmax,
cfilter_dmax, cfilter_dmax2,
cfilter_dmax16, cfilter_dmax4
)
from td3a_cpp.tools import measure_time_dim
def get_vectors(fct, n, h=200, dtype=numpy.float64):
ctxs = [dict(va=numpy.random.randn(n).astype(dtype),
fil=fct,
mx=numpy.float64(0),
x_name=n)
for n in range(10, n, h)]
return ctxs
def numpy_filter(va, mx):
va[va > mx] = mx
all_res = []
for fct in [numpy_filter,
pyfilter_dmax, filter_dmax_cython,
filter_dmax_cython_optim,
cyfilter_dmax,
cfilter_dmax, cfilter_dmax2,
cfilter_dmax16, cfilter_dmax4]:
print(fct)
ctxs = get_vectors(fct, 1000 if fct == pyfilter_dmax else 40000)
res = list(measure_time_dim('fil(va, mx)', ctxs, verbose=1))
for r in res:
r['fct'] = fct.__name__
all_res.extend(res)
pprint.pprint(all_res[:2])
<function numpy_filter at 0x7fb4f7b0e700>
0%| | 0/200 [00:00<?, ?it/s]
4%|4 | 9/200 [00:00<00:02, 88.79it/s]
9%|9 | 18/200 [00:00<00:02, 79.97it/s]
14%|#3 | 27/200 [00:00<00:02, 73.93it/s]
18%|#7 | 35/200 [00:00<00:02, 69.65it/s]
22%|##1 | 43/200 [00:00<00:02, 65.79it/s]
25%|##5 | 50/200 [00:00<00:02, 62.66it/s]
28%|##8 | 57/200 [00:00<00:02, 59.32it/s]
32%|###1 | 63/200 [00:00<00:02, 56.53it/s]
34%|###4 | 69/200 [00:01<00:02, 54.22it/s]
38%|###7 | 75/200 [00:01<00:02, 51.78it/s]
40%|#### | 81/200 [00:01<00:02, 49.64it/s]
43%|####3 | 86/200 [00:01<00:02, 48.08it/s]
46%|####5 | 91/200 [00:01<00:02, 46.41it/s]
48%|####8 | 96/200 [00:01<00:02, 44.86it/s]
50%|##### | 101/200 [00:01<00:02, 43.46it/s]
53%|#####3 | 106/200 [00:01<00:02, 42.24it/s]
56%|#####5 | 111/200 [00:02<00:02, 41.04it/s]
58%|#####8 | 116/200 [00:02<00:02, 39.93it/s]
60%|###### | 121/200 [00:02<00:02, 38.97it/s]
62%|######2 | 125/200 [00:02<00:01, 38.15it/s]
64%|######4 | 129/200 [00:02<00:01, 37.33it/s]
66%|######6 | 133/200 [00:02<00:01, 36.57it/s]
68%|######8 | 137/200 [00:02<00:01, 35.83it/s]
70%|####### | 141/200 [00:02<00:01, 35.13it/s]
72%|#######2 | 145/200 [00:03<00:01, 34.51it/s]
74%|#######4 | 149/200 [00:03<00:01, 33.89it/s]
76%|#######6 | 153/200 [00:03<00:01, 33.30it/s]
78%|#######8 | 157/200 [00:03<00:01, 32.74it/s]
80%|######## | 161/200 [00:03<00:01, 32.19it/s]
82%|########2 | 165/200 [00:03<00:01, 31.66it/s]
84%|########4 | 169/200 [00:03<00:00, 31.12it/s]
86%|########6 | 173/200 [00:03<00:00, 30.67it/s]
88%|########8 | 177/200 [00:04<00:00, 30.21it/s]
90%|######### | 181/200 [00:04<00:00, 29.75it/s]
92%|#########2| 184/200 [00:04<00:00, 29.39it/s]
94%|#########3| 187/200 [00:04<00:00, 28.95it/s]
95%|#########5| 190/200 [00:04<00:00, 28.52it/s]
96%|#########6| 193/200 [00:04<00:00, 28.19it/s]
98%|#########8| 196/200 [00:04<00:00, 27.89it/s]
100%|#########9| 199/200 [00:04<00:00, 27.56it/s]
100%|##########| 200/200 [00:04<00:00, 40.40it/s]
<built-in function pyfilter_dmax>
0%| | 0/5 [00:00<?, ?it/s]
60%|###### | 3/5 [00:00<00:00, 21.96it/s]
100%|##########| 5/5 [00:00<00:00, 11.13it/s]
<built-in function filter_dmax_cython>
0%| | 0/200 [00:00<?, ?it/s]
12%|#2 | 24/200 [00:00<00:00, 225.51it/s]
24%|##3 | 47/200 [00:00<00:01, 135.45it/s]
32%|###1 | 63/200 [00:00<00:01, 103.51it/s]
38%|###7 | 75/200 [00:00<00:01, 86.18it/s]
42%|####2 | 85/200 [00:00<00:01, 74.45it/s]
46%|####6 | 93/200 [00:01<00:01, 66.29it/s]
50%|##### | 100/200 [00:01<00:01, 59.94it/s]
54%|#####3 | 107/200 [00:01<00:01, 54.24it/s]
56%|#####6 | 113/200 [00:01<00:01, 50.02it/s]
60%|#####9 | 119/200 [00:01<00:01, 46.29it/s]
62%|######2 | 124/200 [00:01<00:01, 43.49it/s]
64%|######4 | 129/200 [00:02<00:01, 40.96it/s]
67%|######7 | 134/200 [00:02<00:01, 38.73it/s]
69%|######9 | 138/200 [00:02<00:01, 37.10it/s]
71%|#######1 | 142/200 [00:02<00:01, 35.58it/s]
73%|#######3 | 146/200 [00:02<00:01, 34.19it/s]
75%|#######5 | 150/200 [00:02<00:01, 32.95it/s]
77%|#######7 | 154/200 [00:02<00:01, 31.80it/s]
79%|#######9 | 158/200 [00:02<00:01, 30.81it/s]
81%|########1 | 162/200 [00:03<00:01, 29.90it/s]
82%|########2 | 165/200 [00:03<00:01, 29.20it/s]
84%|########4 | 168/200 [00:03<00:01, 28.56it/s]
86%|########5 | 171/200 [00:03<00:01, 27.86it/s]
87%|########7 | 174/200 [00:03<00:00, 27.25it/s]
88%|########8 | 177/200 [00:03<00:00, 26.72it/s]
90%|######### | 180/200 [00:03<00:00, 26.21it/s]
92%|#########1| 183/200 [00:03<00:00, 25.76it/s]
93%|#########3| 186/200 [00:04<00:00, 25.26it/s]
94%|#########4| 189/200 [00:04<00:00, 24.86it/s]
96%|#########6| 192/200 [00:04<00:00, 24.49it/s]
98%|#########7| 195/200 [00:04<00:00, 24.11it/s]
99%|#########9| 198/200 [00:04<00:00, 23.70it/s]
100%|##########| 200/200 [00:04<00:00, 43.10it/s]
<built-in function filter_dmax_cython_optim>
0%| | 0/200 [00:00<?, ?it/s]
12%|#2 | 24/200 [00:00<00:00, 225.61it/s]
24%|##3 | 47/200 [00:00<00:01, 135.19it/s]
32%|###1 | 63/200 [00:00<00:01, 103.23it/s]
38%|###7 | 75/200 [00:00<00:01, 86.00it/s]
42%|####2 | 85/200 [00:00<00:01, 74.34it/s]
46%|####6 | 93/200 [00:01<00:01, 66.27it/s]
50%|##### | 100/200 [00:01<00:01, 59.95it/s]
54%|#####3 | 107/200 [00:01<00:01, 54.39it/s]
56%|#####6 | 113/200 [00:01<00:01, 50.17it/s]
60%|#####9 | 119/200 [00:01<00:01, 46.42it/s]
62%|######2 | 124/200 [00:01<00:01, 43.61it/s]
64%|######4 | 129/200 [00:02<00:01, 41.08it/s]
67%|######7 | 134/200 [00:02<00:01, 38.83it/s]
69%|######9 | 138/200 [00:02<00:01, 37.17it/s]
71%|#######1 | 142/200 [00:02<00:01, 35.64it/s]
73%|#######3 | 146/200 [00:02<00:01, 34.25it/s]
75%|#######5 | 150/200 [00:02<00:01, 33.01it/s]
77%|#######7 | 154/200 [00:02<00:01, 31.89it/s]
79%|#######9 | 158/200 [00:02<00:01, 30.88it/s]
81%|########1 | 162/200 [00:03<00:01, 29.96it/s]
82%|########2 | 165/200 [00:03<00:01, 29.30it/s]
84%|########4 | 168/200 [00:03<00:01, 28.63it/s]
86%|########5 | 171/200 [00:03<00:01, 28.00it/s]
87%|########7 | 174/200 [00:03<00:00, 27.39it/s]
88%|########8 | 177/200 [00:03<00:00, 26.83it/s]
90%|######### | 180/200 [00:03<00:00, 26.30it/s]
92%|#########1| 183/200 [00:03<00:00, 25.83it/s]
93%|#########3| 186/200 [00:04<00:00, 25.38it/s]
94%|#########4| 189/200 [00:04<00:00, 24.96it/s]
96%|#########6| 192/200 [00:04<00:00, 24.55it/s]
98%|#########7| 195/200 [00:04<00:00, 24.16it/s]
99%|#########9| 198/200 [00:04<00:00, 23.79it/s]
100%|##########| 200/200 [00:04<00:00, 43.19it/s]
<built-in function cyfilter_dmax>
0%| | 0/200 [00:00<?, ?it/s]
11%|#1 | 22/200 [00:00<00:00, 215.20it/s]
22%|##2 | 44/200 [00:00<00:01, 133.83it/s]
30%|### | 60/200 [00:00<00:01, 102.71it/s]
36%|###6 | 72/200 [00:00<00:01, 85.73it/s]
41%|####1 | 82/200 [00:00<00:01, 74.25it/s]
45%|####5 | 90/200 [00:01<00:01, 66.27it/s]
48%|####8 | 97/200 [00:01<00:01, 60.03it/s]
52%|#####2 | 104/200 [00:01<00:01, 54.54it/s]
55%|#####5 | 110/200 [00:01<00:01, 50.35it/s]
58%|#####8 | 116/200 [00:01<00:01, 46.65it/s]
60%|###### | 121/200 [00:01<00:01, 43.85it/s]
63%|######3 | 126/200 [00:01<00:01, 41.32it/s]
66%|######5 | 131/200 [00:02<00:01, 39.09it/s]
68%|######7 | 135/200 [00:02<00:01, 37.43it/s]
70%|######9 | 139/200 [00:02<00:01, 35.89it/s]
72%|#######1 | 143/200 [00:02<00:01, 34.50it/s]
74%|#######3 | 147/200 [00:02<00:01, 33.22it/s]
76%|#######5 | 151/200 [00:02<00:01, 32.10it/s]
78%|#######7 | 155/200 [00:02<00:01, 31.07it/s]
80%|#######9 | 159/200 [00:03<00:01, 30.16it/s]
82%|########1 | 163/200 [00:03<00:01, 29.30it/s]
83%|########2 | 166/200 [00:03<00:01, 28.68it/s]
84%|########4 | 169/200 [00:03<00:01, 28.06it/s]
86%|########6 | 172/200 [00:03<00:01, 27.48it/s]
88%|########7 | 175/200 [00:03<00:00, 26.92it/s]
89%|########9 | 178/200 [00:03<00:00, 26.38it/s]
90%|######### | 181/200 [00:03<00:00, 25.89it/s]
92%|#########2| 184/200 [00:04<00:00, 25.42it/s]
94%|#########3| 187/200 [00:04<00:00, 24.98it/s]
95%|#########5| 190/200 [00:04<00:00, 24.56it/s]
96%|#########6| 193/200 [00:04<00:00, 24.16it/s]
98%|#########8| 196/200 [00:04<00:00, 23.79it/s]
100%|#########9| 199/200 [00:04<00:00, 23.42it/s]
100%|##########| 200/200 [00:04<00:00, 42.42it/s]
<built-in function cfilter_dmax>
0%| | 0/200 [00:00<?, ?it/s]
11%|#1 | 22/200 [00:00<00:00, 211.54it/s]
22%|##2 | 44/200 [00:00<00:01, 131.38it/s]
30%|##9 | 59/200 [00:00<00:01, 102.26it/s]
36%|###5 | 71/200 [00:00<00:01, 85.18it/s]
40%|#### | 81/200 [00:00<00:01, 73.61it/s]
44%|####4 | 89/200 [00:01<00:01, 65.70it/s]
48%|####8 | 96/200 [00:01<00:01, 59.50it/s]
52%|#####1 | 103/200 [00:01<00:01, 53.99it/s]
55%|#####4 | 109/200 [00:01<00:01, 49.84it/s]
57%|#####6 | 114/200 [00:01<00:01, 46.69it/s]
60%|#####9 | 119/200 [00:01<00:01, 43.77it/s]
62%|######2 | 124/200 [00:01<00:01, 41.17it/s]
64%|######4 | 129/200 [00:02<00:01, 38.95it/s]
66%|######6 | 133/200 [00:02<00:01, 37.28it/s]
68%|######8 | 137/200 [00:02<00:01, 35.71it/s]
70%|####### | 141/200 [00:02<00:01, 34.29it/s]
72%|#######2 | 145/200 [00:02<00:01, 33.02it/s]
74%|#######4 | 149/200 [00:02<00:01, 31.89it/s]
76%|#######6 | 153/200 [00:02<00:01, 30.88it/s]
78%|#######8 | 157/200 [00:03<00:01, 29.97it/s]
80%|######## | 160/200 [00:03<00:01, 29.30it/s]
82%|########1 | 163/200 [00:03<00:01, 28.63it/s]
83%|########2 | 166/200 [00:03<00:01, 28.05it/s]
84%|########4 | 169/200 [00:03<00:01, 27.51it/s]
86%|########6 | 172/200 [00:03<00:01, 26.98it/s]
88%|########7 | 175/200 [00:03<00:00, 26.44it/s]
89%|########9 | 178/200 [00:03<00:00, 25.95it/s]
90%|######### | 181/200 [00:03<00:00, 25.50it/s]
92%|#########2| 184/200 [00:04<00:00, 25.01it/s]
94%|#########3| 187/200 [00:04<00:00, 24.61it/s]
95%|#########5| 190/200 [00:04<00:00, 24.21it/s]
96%|#########6| 193/200 [00:04<00:00, 23.79it/s]
98%|#########8| 196/200 [00:04<00:00, 23.40it/s]
100%|#########9| 199/200 [00:04<00:00, 23.03it/s]
100%|##########| 200/200 [00:04<00:00, 41.73it/s]
<built-in function cfilter_dmax2>
0%| | 0/200 [00:00<?, ?it/s]
12%|#2 | 24/200 [00:00<00:00, 239.33it/s]
24%|##4 | 48/200 [00:00<00:00, 160.17it/s]
33%|###3 | 66/200 [00:00<00:01, 125.83it/s]
40%|#### | 80/200 [00:00<00:01, 105.62it/s]
46%|####6 | 92/200 [00:00<00:01, 91.21it/s]
51%|#####1 | 102/200 [00:01<00:01, 81.25it/s]
56%|#####5 | 111/200 [00:01<00:01, 73.34it/s]
60%|#####9 | 119/200 [00:01<00:01, 67.06it/s]
63%|######3 | 126/200 [00:01<00:01, 62.16it/s]
66%|######6 | 133/200 [00:01<00:01, 57.70it/s]
70%|######9 | 139/200 [00:01<00:01, 54.28it/s]
72%|#######2 | 145/200 [00:01<00:01, 51.13it/s]
76%|#######5 | 151/200 [00:02<00:01, 48.36it/s]
78%|#######8 | 156/200 [00:02<00:00, 46.21it/s]
80%|######## | 161/200 [00:02<00:00, 44.25it/s]
83%|########2 | 166/200 [00:02<00:00, 42.53it/s]
86%|########5 | 171/200 [00:02<00:00, 40.93it/s]
88%|########8 | 176/200 [00:02<00:00, 39.55it/s]
90%|######### | 180/200 [00:02<00:00, 38.46it/s]
92%|#########2| 184/200 [00:02<00:00, 37.45it/s]
94%|#########3| 188/200 [00:03<00:00, 36.42it/s]
96%|#########6| 192/200 [00:03<00:00, 35.53it/s]
98%|#########8| 196/200 [00:03<00:00, 34.70it/s]
100%|##########| 200/200 [00:03<00:00, 33.91it/s]
100%|##########| 200/200 [00:03<00:00, 59.05it/s]
<built-in function cfilter_dmax16>
0%| | 0/200 [00:00<?, ?it/s]
11%|#1 | 22/200 [00:00<00:00, 205.97it/s]
22%|##1 | 43/200 [00:00<00:01, 130.83it/s]
29%|##9 | 58/200 [00:00<00:01, 101.33it/s]
35%|###5 | 70/200 [00:00<00:01, 84.39it/s]
40%|#### | 80/200 [00:00<00:01, 72.85it/s]
44%|####4 | 88/200 [00:01<00:01, 65.19it/s]
48%|####7 | 95/200 [00:01<00:01, 58.90it/s]
51%|#####1 | 102/200 [00:01<00:01, 53.41it/s]
54%|#####4 | 108/200 [00:01<00:01, 49.25it/s]
56%|#####6 | 113/200 [00:01<00:01, 46.14it/s]
59%|#####8 | 118/200 [00:01<00:01, 43.35it/s]
62%|######1 | 123/200 [00:01<00:01, 40.82it/s]
64%|######4 | 128/200 [00:02<00:01, 38.73it/s]
66%|######6 | 132/200 [00:02<00:01, 37.09it/s]
68%|######8 | 136/200 [00:02<00:01, 35.54it/s]
70%|####### | 140/200 [00:02<00:01, 34.11it/s]
72%|#######2 | 144/200 [00:02<00:01, 32.87it/s]
74%|#######4 | 148/200 [00:02<00:01, 31.76it/s]
76%|#######6 | 152/200 [00:02<00:01, 30.65it/s]
78%|#######8 | 156/200 [00:03<00:01, 29.74it/s]
80%|#######9 | 159/200 [00:03<00:01, 29.07it/s]
81%|########1 | 162/200 [00:03<00:01, 28.41it/s]
82%|########2 | 165/200 [00:03<00:01, 27.75it/s]
84%|########4 | 168/200 [00:03<00:01, 27.12it/s]
86%|########5 | 171/200 [00:03<00:01, 26.46it/s]
87%|########7 | 174/200 [00:03<00:01, 25.96it/s]
88%|########8 | 177/200 [00:03<00:00, 25.48it/s]
90%|######### | 180/200 [00:03<00:00, 25.02it/s]
92%|#########1| 183/200 [00:04<00:00, 24.36it/s]
93%|#########3| 186/200 [00:04<00:00, 23.87it/s]
94%|#########4| 189/200 [00:04<00:00, 23.84it/s]
96%|#########6| 192/200 [00:04<00:00, 23.31it/s]
98%|#########7| 195/200 [00:04<00:00, 23.02it/s]
99%|#########9| 198/200 [00:04<00:00, 22.49it/s]
100%|##########| 200/200 [00:04<00:00, 40.89it/s]
<built-in function cfilter_dmax4>
0%| | 0/200 [00:00<?, ?it/s]
10%|# | 21/200 [00:00<00:00, 207.20it/s]
21%|##1 | 42/200 [00:00<00:01, 129.75it/s]
28%|##8 | 57/200 [00:00<00:01, 100.04it/s]
34%|###4 | 69/200 [00:00<00:01, 82.43it/s]
40%|###9 | 79/200 [00:00<00:01, 71.01it/s]
44%|####3 | 87/200 [00:01<00:01, 62.81it/s]
47%|####6 | 94/200 [00:01<00:01, 56.72it/s]
50%|##### | 100/200 [00:01<00:01, 51.85it/s]
53%|#####3 | 106/200 [00:01<00:01, 47.68it/s]
56%|#####5 | 111/200 [00:01<00:02, 44.42it/s]
58%|#####8 | 116/200 [00:01<00:02, 41.50it/s]
60%|###### | 121/200 [00:02<00:02, 38.96it/s]
62%|######2 | 125/200 [00:02<00:02, 37.09it/s]
64%|######4 | 129/200 [00:02<00:02, 35.37it/s]
66%|######6 | 133/200 [00:02<00:01, 33.90it/s]
68%|######8 | 137/200 [00:02<00:01, 32.33it/s]
70%|####### | 141/200 [00:02<00:01, 30.95it/s]
72%|#######2 | 145/200 [00:02<00:01, 29.90it/s]
74%|#######4 | 148/200 [00:02<00:01, 29.15it/s]
76%|#######5 | 151/200 [00:03<00:01, 28.44it/s]
77%|#######7 | 154/200 [00:03<00:01, 27.75it/s]
78%|#######8 | 157/200 [00:03<00:01, 27.09it/s]
80%|######## | 160/200 [00:03<00:01, 26.51it/s]
82%|########1 | 163/200 [00:03<00:01, 25.95it/s]
83%|########2 | 166/200 [00:03<00:01, 25.43it/s]
84%|########4 | 169/200 [00:03<00:01, 24.98it/s]
86%|########6 | 172/200 [00:03<00:01, 24.55it/s]
88%|########7 | 175/200 [00:04<00:01, 24.13it/s]
89%|########9 | 178/200 [00:04<00:00, 23.70it/s]
90%|######### | 181/200 [00:04<00:00, 23.30it/s]
92%|#########2| 184/200 [00:04<00:00, 22.91it/s]
94%|#########3| 187/200 [00:04<00:00, 22.54it/s]
95%|#########5| 190/200 [00:04<00:00, 22.19it/s]
96%|#########6| 193/200 [00:04<00:00, 21.84it/s]
98%|#########8| 196/200 [00:04<00:00, 21.51it/s]
100%|#########9| 199/200 [00:05<00:00, 21.19it/s]
100%|##########| 200/200 [00:05<00:00, 38.57it/s]
[{'average': 1.7719401046633722e-05,
'context_size': 232,
'deviation': 3.870494162395394e-07,
'fct': 'numpy_filter',
'max_exec': 1.8473220989108087e-05,
'min_exec': 1.7433222383260726e-05,
'number': 50,
'repeat': 10,
'x_name': 10},
{'average': 1.8014476634562016e-05,
'context_size': 232,
'deviation': 2.0771029146282817e-07,
'fct': 'numpy_filter',
'max_exec': 1.840401440858841e-05,
'min_exec': 1.7849020659923555e-05,
'number': 50,
'repeat': 10,
'x_name': 210}]
Let’s display the results¶
cc = DataFrame(all_res)
cc['N'] = cc['x_name']
fig, ax = plt.subplots(2, 2, figsize=(10, 10))
cc[cc.N <= 1100].pivot(
index='N', columns='fct', values='average').plot(
logy=True, ax=ax[0, 0])
cc[cc.fct != 'pyfilter_dmax'].pivot(
index='N', columns='fct', values='average').plot(
logy=True, ax=ax[0, 1])
cc[cc.fct != 'pyfilter_dmax'].pivot(
index='N', columns='fct', values='average').plot(
logy=True, logx=True, ax=ax[1, 1])
cc[(cc.fct.str.contains('cfilter') |
cc.fct.str.contains('numpy'))].pivot(
index='N', columns='fct', values='average').plot(
logy=True, ax=ax[1, 0])
ax[0, 0].set_title("Comparison of filter implementations")
ax[0, 1].set_title("Comparison of filter implementations\n"
"without pyfilter_dmax")
Text(0.5, 1.0, 'Comparison of filter implementations\nwithout pyfilter_dmax')
The results depends on the machine, its number of cores, the compilation settings of numpy or this module.
plt.show()
Total running time of the script: ( 0 minutes 45.985 seconds)