为什么random.choice这么慢?

Bli*_*ink 8 python random numpy

在编写脚本时,我发现了numpy.random.choice函数.我实现它是因为它比等效的if语句更清晰.但是,在运行脚本后,我意识到这是显著比if语句慢.

以下是MWE.第一种方法需要0.0秒,而第二种方法需要7.2秒.如果你扩展i循环,你会看到random.choice的速度变慢了.

任何人都可以评论为什么random.choice这么慢?

import numpy as np
import numpy.random as rand
import time as tm

#-------------------------------------------------------------------------------

tStart = tm.time()
for i in xrange(100):
    for j in xrange(1000):
        tmp = rand.rand()
        if tmp < 0.25:
            var = 1
        elif tmp < 0.5:
            var = -1
print('Time: %.1f s' %(tm.time() - tStart))

#-------------------------------------------------------------------------------

tStart = tm.time()
for i in xrange(100):
    for j in xrange(1000):
        var = rand.choice([-1, 0, 1], p = [0.25, 0.5, 0.25])
print('Time: %.1f s' %(tm.time() - tStart))
Run Code Online (Sandbox Code Playgroud)

use*_*ica 17

你错了.矢量化操作,或numpy将不提供任何好处:

var = numpy.random.choice([-1, 0, 1], size=1000, p=[0.25, 0.5, 0.25])
Run Code Online (Sandbox Code Playgroud)

时间数据:

>>> timeit.timeit('''numpy.random.choice([-1, 0, 1],
...                                      size=1000,
...                                      p=[0.25, 0.5, 0.25])''',
...               'import numpy', number=10000)
2.380380242513752

>>> timeit.timeit('''
... var = []
... for i in xrange(1000):
...     tmp = rand.rand()
...     if tmp < 0.25:
...         var.append(1)
...     elif tmp < 0.5:
...         var.append(-1)
...     else:
...         var.append(0)''',
... setup='import numpy.random as rand', number=10000)
5.673041396894519
Run Code Online (Sandbox Code Playgroud)

  • +1这比第一个循环快约7倍. (2认同)