vas*_*sco 1 python optimization
只是一个学术问题.我很好奇这个代码的哪个版本在Python中更好(更快)?
var = random.randint(1, 10)
# First version
if var in [2, 5, 9]:
print "First: 2, 5 or 9"
# Second version
if var == 2 or number == 5 or number == 9:
print "Second: 2, 5 or 9"
Run Code Online (Sandbox Code Playgroud)
这是一个非常简单的例子,但是如果变量var
不是数字,而是字符串呢?
var = 'aaa'
# First version
if var in ['aaa', 'zzz', 'eee']:
print "String"
Run Code Online (Sandbox Code Playgroud)
那些更复杂的对象(不仅是数字或字符串,还有一些非常耗时的比较)?
Python编译器内部会发生什么?我想if var in list
是执行如下:
for l in list:
if l == var:
print "String"
Run Code Online (Sandbox Code Playgroud)
所以在我看来,第一个例子中的两个版本都是相同的(速度).我对吗?
定时代码将显示哪个是最快的.使用timeit模块:
~ $ python -m timeit --setup 'var=2' 'var in [2, 5, 9]'
10000000 loops, best of 3: 0.0629 usec per loop
~ $ python -m timeit --setup 'var=5' 'var in [2, 5, 9]'
10000000 loops, best of 3: 0.0946 usec per loop
~ $ python -m timeit --setup 'var=9' 'var in [2, 5, 9]'
10000000 loops, best of 3: 0.117 usec per loop
~ $ python -m timeit --setup 'var=2' 'var == 2 or var==5 or var == 9'
10000000 loops, best of 3: 0.0583 usec per loop
~ $ python -m timeit --setup 'var=5' 'var == 2 or var==5 or var == 9'
10000000 loops, best of 3: 0.104 usec per loop
~ $ python -m timeit --setup 'var=9' 'var == 2 or var==5 or var == 9'
10000000 loops, best of 3: 0.127 usec per loop
Run Code Online (Sandbox Code Playgroud)
如果你想提高你对Python在幕后做什么的直觉并且知道哪个代码最快,那么首先要反汇编代码:
def f(x):
var = random.randint(1, 10)
# First version
if var in [2, 5, 9]:
print "First: 2, 5 or 9"
# Second version
if var == 2 or number == 5 or number == 9:
print "Second: 2, 5 or 9"
import dis
dis.dis(f)
Run Code Online (Sandbox Code Playgroud)
这将显示这个或这个或那个代码比列表.__ contains__版本执行更多步骤.
FWIW,您可能也想要考虑使用集而不是列表.他们的O(1)查找倾向于根据关键频率击败列表(是最可能匹配的列表的第一个元素),以及散列函数的成本,以及元素的数量(集合比列表更好地扩展)他们的O(n)搜索:
if var in {2, 5, 9}:
...
Run Code Online (Sandbox Code Playgroud)
在我的机器上,集合对搜索少量整数元素没有帮助:
~ $ python -m timeit --setup 'var=2' 'var in {2, 5, 9}'
1000000 loops, best of 3: 0.276 usec per loop
~ $ python -m timeit --setup 'var=5' 'var in {2, 5, 9}'
1000000 loops, best of 3: 0.281 usec per loop
~ $ python -m timeit --setup 'var=9' 'var in {2, 5, 9}'
1000000 loops, best of 3: 0.304 usec per loop
Run Code Online (Sandbox Code Playgroud)