只是一个学术问题。我很好奇此代码的哪个版本在 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"
这是一个非常简单的示例,但是如果变量 var 不是数字而是字符串怎么办?
var = 'aaa'
# First version
if var in ['aaa', 'zzz', 'eee']:
print "String"
一些更复杂的对象(不仅是数字或字符串,还有一些比较耗时的类)呢?
Python 编译器内部发生了什么?我想 if var in list 的执行方式如下:
for l in list:
if l == var:
print "String"
所以在我看来,第一个示例中的两个版本是相同的(速度)。我说得对吗?
请您参考如下方法:
计时代码将显示哪个最快。使用 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
如果您想提高对 Python 在幕后所做工作的直觉并了解哪种代码最快,请从 disassembling code 开始:
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)
这将显示 this-or-this-or-that 代码比 list.__contains__ 版本执行更多步骤。
FWIW,您可能也想考虑使用集合而不是列表。他们的 O(1) 查找往往会根据键频率(列表的第一个元素最有可能匹配)、散列函数的开销以及元素的数量(集合比列表更好地扩展)来击败列表用他们的 O(n) 搜索:
if var in {2, 5, 9}:
...
在我的机器上,集合对搜索少量整数元素没有帮助:
~ $ 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
