从 `%timeit` ipython magic 获取平均运行时间

nic*_*_eu 6 python ipython timeit

尝试对不同的随机函数进行计时,以查看从列表中选择随机项目的最快方法。%timeit想要给我“3个中最好的”最快时间,但由于运行是随机的,因此访问时间存在很大差异(从列表后面抓取,会很慢;从前面抓取,会很快)。

\n\n

如何获得所有循环的平均值,而不是最好的?

\n\n
a = [0,6,3,1,3,9,4,3,2,6]\n\n%timeit random.choice(a)\n%timeit a[random.randint(0,len(a)-1)]\n%timeit a[np.random.randint(0,len(a)-1)]\n%timeit np.random.choice(a,1)[0]\n
Run Code Online (Sandbox Code Playgroud)\n\n

当前输出(确认时间差异):

\n\n
%timeit random.choice(a)\nThe slowest run took 9.87 times longer than the fastest. This could mean that an intermediate result is being cached \n1000000 loops, best of 3: 1.23 \xc2\xb5s per loop\n
Run Code Online (Sandbox Code Playgroud)\n\n

更新:一种拼凑方法:

\n\n
%time for i in range(100000): random.choice(a)\n%time for i in range(100000): a[random.randint(0,len(a)-1)]\n%time for i in range(100000): a[np.random.randint(0,len(a)-1)]\n%time for i in range(100000): np.random.choice(a,1)[0]\n
Run Code Online (Sandbox Code Playgroud)\n

ali*_*i_m 5

你可以使用timeit.repeat

import timeit
import numpy as np

reps = timeit.repeat(repeat=3, n=10000,
                     stmt="np.random.choice(a)",
                     setup="import numpy as np; a=[0,6,3,1,3,9,4,3,2,6]")

# taking the median might be better, since I suspect the distribution of times will
# be heavily skewed
avg = np.mean(reps)
Run Code Online (Sandbox Code Playgroud)

一个潜在的问题是,您可能会遇到缓存效应,这可能会使您的计时变得不那么有意义(请参阅此处)。例如,您可能希望使用setup=参数在每次迭代中生成一个新的随机列表。


kay*_*kay 0

有多快

random_fd = open('/dev/urandom', 'rb')

a = array.array('I')
a.read(random_fd, 10**8)

get_next_rand = iter(a).next
Run Code Online (Sandbox Code Playgroud)

为你?如果这是你的瓶颈,我会立即生成大量随机数。

在我的旧电脑中:

%timeit array.array('I').read(open('/dev/urandom', 'rb'), 10**6)
1 loop, best of 3: 200 ms per loop
Run Code Online (Sandbox Code Playgroud)