为清晰起见编辑:基本上我想知道的是我可以在共享的Linux机器上采取哪些步骤来确保我的Python代码的性能尽可能一致?
我正在尝试使用timeit
模块确定两个不同代码段的速度。不幸的是,结果变化很大,我不知道哪个更好。
这里的两段代码是a)用Cython编译的Numpy函数和b)用Cython编译的类C函数。它们基本上生成一堆随机数并将它们分成一个数字(parts
)的二进制数。 (没有读取/写入磁盘,所以这不是我的问题。)我在测试期间运行了两次函数,并重复测试200次,从200次测试中选出最佳时间。
我正在运行以测试两个函数的速度的Python代码如下所示:
import timeit
num = 20
repeat = 200
setup = '''import my_cython_code as sc
parts = 100'''
print "pyx: ", min(timeit.repeat('sc.pyx(parts)',
number=num, setup=setup, repeat=repeat))
print "c: ", min(timeit.repeat('sc.c(parts)',
number=num, setup=setup, repeat=repeat))
print "pyx: ", min(timeit.repeat('sc.pyx(parts)',
number=num, setup=setup, repeat=repeat))
print "c: ", min(timeit.repeat('sc.c(parts)',
number=num, setup=setup, repeat=repeat))
print "pyx: ", min(timeit.repeat('sc.pyx(parts)',
number=num, setup=setup, repeat=repeat))
print "c: ", min(timeit.repeat('sc.c(parts)',
number=num, setup=setup, repeat=repeat))
print "pyx: ", min(timeit.repeat('sc.pyx(parts)',
number=num, setup=setup, repeat=repeat))
print "c: ", min(timeit.repeat('sc.c(parts)',
number=num, setup=setup, repeat=repeat))
print "pyx: ", min(timeit.repeat('sc.pyx(parts)',
number=num, setup=setup, repeat=repeat))
当我运行它时,我得到如下输出:
pyx: 0.00450992584229
c: 0.00507998466492
pyx: 0.00416111946106
c: 0.0036518573761
pyx: 0.00330686569214
c: 0.00355005264282
pyx: 0.00322699546814
c: 0.00346803665161
pyx: 0.00327897071838
为什么会有这么多变化?如何确保性能更加一致?我在安装了Scientific Linux 6.6版的共享机器上运行代码。 (我不是管理员,因此无法阻止其他人的流程/等以测试性能。)
注意:我很欣赏在这种情况下,这两个函数看起来几乎同样快,所以我的努力可能有点误导。
通常我会使用更大的parts
值,在10000-100000的范围内,这使得两个函数都慢得多(~O(n))。如果值越大,这两个函数之间可能会有更显着的差异 - 这就是我感兴趣的内容。在这种情况下,我使用较小的值来进行演示,而不是任何函数。
不幸的是,由于性能不一致,我无法分辨哪个更快,因此这个问题。
遵循高绩效标志的建议:
pyx: min: 0.004488 max: 0.008562 avg: 0.005900 std: 0.001607
c: min: 0.005030 max: 0.005783 avg: 0.005304 std: 0.000149
pyx: min: 0.004416 max: 0.006408 avg: 0.004995 std: 0.000382
c: min: 0.004878 max: 0.005824 avg: 0.005357 std: 0.000184
pyx: min: 0.004481 max: 0.005147 avg: 0.004721 std: 0.000130
c: min: 0.005025 max: 0.005717 avg: 0.005277 std: 0.000145
pyx: min: 0.003409 max: 0.004910 avg: 0.004073 std: 0.000508
c: min: 0.003712 max: 0.005244 avg: 0.004436 std: 0.000497
平均值大部分时间都比较稳定,但我偶尔会遇到奇怪的表现,如上所述。
num = 1000
和repeat = 50
:
pyx: min: 0.022578 max: 0.036049 avg: 0.026740 std: 0.005088
c: min: 0.024303 max: 0.029202 avg: 0.027013 std: 0.001051
pyx: min: 0.022904 max: 0.025746 avg: 0.024109 std: 0.000616
c: min: 0.018185 max: 0.026352 avg: 0.020287 std: 0.002845
pyx: min: 0.016775 max: 0.017728 avg: 0.017132 std: 0.000195
c: min: 0.018132 max: 0.020774 avg: 0.019203 std: 0.000714
pyx: min: 0.016763 max: 0.017589 avg: 0.017049 std: 0.000186
c: min: 0.017587 max: 0.021777 avg: 0.018697 std: 0.001005