【发布时间】:2016-02-24 01:13:05
【问题描述】:
在我的纯 python 图论库中,我遇到了一个相对于可比较的 MATLAB 代码的时间性能非常差的函数,因此我尝试分析该函数中的一些操作。
我追踪到如下结果
In [27]: timeit.timeit( 'permutation(138)[:4]', setup='from numpy.random import permutation', number=1000000)
Out[27]: 27.659916877746582
将其与 MATLAB 中的性能进行比较
>> tic; for i=1:1000000; randperm(138,4); end; toc
Elapsed time is 4.593305 seconds.
通过将其更改为 np.random.choice 而不是我最初写的 np.random.permutation,我能够显着提高性能。
In [42]: timeit.timeit( 'choice(138, 4)', setup='from numpy.random import choice', number=1000000)
Out[42]: 18.9618501663208
但它仍然没有接近 matlab 的性能。
是否有另一种方法可以在纯 python 中获得这种行为,时间性能接近 MATLAB 时间性能?
【问题讨论】:
-
别忘了,如果您想要一个无需更换的样品,您需要将
replace=False传递给np.random.choice。 (不是性能改进,但它是正确性的重要修复。) -
numpy.random.choice在此类用例中存在长期存在的性能问题,请参阅 github.com/numpy/numpy/issues/2764