Skip to main content
 首页 » 编程设计

python之这个 Python 代码的哪个版本更快

2025年05月04日13bjzhanghao

只是一个学术问题。我很好奇此代码的哪个版本在 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