python - 复杂列表理解比直接循环慢

标签 python

我在 leetcode 上看到了一个有趣的编程练习解决方案它甚至与问题/解决方案本身无关,因此您可以根据需要在提供的链接上阅读它。然而,一个高票数的解决方案是这个类轮:

片段 1

def fizzBuzz2(n):
    return  ["Fizz" * (not i%3) + "Buzz" * (not i%5) or str(i) for i in range(1, n+1)]

片段2

def fizzBuzz(n):
    out = []
    for i in range(1, n+1):
        if i % 3 == 0 and i % 5 == 0:
            out.append("FizzBuzz")
        elif i % 3 == 0:
            out.append("Fizz")
        elif i % 5 == 0:
            out.append("Buzz")
        else:
            out.append(str(i))
            
    return out

但是,我曾预计列表推导式会击败普通循环,但当我对它进行计时时,情况并非如此。即使做了 dis,Snippet 2 也有更多说明。

是什么让 Snippet 1 变慢了?

最佳答案

你的片段

def fizzBuzz2(n):
    return  ["Fizz" * (not i%3) + "Buzz" * (not i%5) or str(i) for i in range(1, n+1)]

执行大量字符串连接(即使是空字符串)。我用一个额外的模运算来换取它,它节省了串联并且它已经更快了。

def fizzBuzz3(n):
    return  ["FizzBuzz" if not i%15 else "Fizz" if not i%3 else "Buzz" if not i%5 else str(i) for i in range(1, n+1)]

顺便说一句,在我的机器上,这两种理解都比“经典”方法更快,所以我得到的结果与你所说的不同:

your comp: 4.927702903747559
my listcomp: 4.343341112136841
classical: 6.015967845916748

所以我优化的 listcomp 获胜(并且似乎在你的机器上也获胜),即使我对 listcomp 的流控制引起的额外模运算不满意)

我的测试协议(protocol)使用 n=1000 执行 10000 次操作:

import time
start_time = time.time()
for i in range(10000):
    fizzBuzz2(1000)
print("your comp:",time.time()-start_time)
start_time = time.time()
for i in range(10000):
    fizzBuzz3(1000)
print("my listcomp:",time.time()-start_time)
start_time = time.time()
for i in range(10000):
    fizzBuzz(1000)
print("classical:",time.time()-start_time)

请注意,即使在“经典”方法中预先计算模数,它也会下降到 5.375272035598755 秒(这很好)但仍然比 listcomps 差,因为所有指令(你也杀死了通过调用保存模计算的方法来提高 listcomp 的速度)。我猜 python 不是在这种情况下获得最快速度的合适语言。

关于python - 复杂列表理解比直接循环慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43166732/

相关文章:

python - 从 Scipy 稀疏矩阵中获取唯一行

python - 如何根据带条件的列值在数据框中插入行?

python - web2py如何制作列表:reference of an other table in db. py

python - 在哪里手动安装python文件

python - 您将如何提高该功能的性能?

python - 使用 Drive v3 将电子表格导出为文本/csv 会出现 500 内部错误

python - 列表的列表..列表的列表?应用正则表达式和 nltk

python - 如何在 tensorflow 中获取张量的数据类型?

Python Pandas : fill a dataframe row by row

python - 如何使用 pandas.read_sql 中的参数在日期之间从 SQLite 表中使用 Python pandas 导入数据