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")
Comparison of filter implementations, Comparison of filter implementations 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)

Gallery generated by Sphinx-Gallery