python - Python:为什么这个列表理解比等效的 for 循环慢 5000 倍?
问题描述
我有一个 Python 脚本,它从 CSV 文件中读取 1000 行。
为什么csv.reader
在列表理解中迭代对象比等效的显式 for 循环慢 4 个数量级?
time.time()
以下是我机器上的代码片段及其时间(通过):
with open("file.csv", 'r', newline = "\n") as f:
reader = csv.reader(f, delimiter = ",")
data = [r for i, r in enumerate(reader) if i < 1000]
# Time: 26.459498167037964 s
with open("file.csv", 'r', newline = "\n") as f:
reader = csv.reader(f, delimiter = ",")
data = []
for i, r in enumerate(reader):
if i >= 1000:
break
data.append(r)
# Time: 0.005597114562988281 s
编辑:
根据答案,列表理解版本读取整个文件并仅选择满足条件的元素i < 1000
,而显式循环在到达时停止i == 1000
。
对于这个问题的未来读者,@decenze 在评论中编写了最优雅的解决方案:
import csv
from itertools import islice
with open("file.csv", 'r', newline = "\n") as f:
reader = csv.reader(f, delimiter = ",")
data = list(islice(reader, 0, 1000))
解决方案
这是答案
在这段代码中,
with open("file.csv", 'r', newline = "\n") as f:
reader = csv.reader(f, delimiter = ",")
data = []
for i, r in enumerate(reader):
if i >= 1000:
break
data.append(r)
在for
范围内,for
如果i >= 1000
但是在这段代码中,没有break
关键字(因为你使用了 List Comprehension)
with open("file.csv", 'r', newline = "\n") as f:
reader = csv.reader(f, delimiter = ",")
data = [r for i, r in enumerate(reader) if i < 1000]
为什么这么慢?因为data = [r ...]
不会中断 if i < 1000
,但会一直读取直到enumerate(reader)
完成。这与之前的代码不同,for
如果i >= 1000
. 但不适用于列表理解
您可以通过 using 或其他方法使用类似的代码raise StopIteration
,例如
def LoopEnd():
raise StopIteration()
with open("file.csv", 'r', newline = "\n") as f:
reader = csv.reader(f, delimiter = ",")
data = [r if i < 1000 else LoopEnd() for i, r in enumerate(reader)]
推荐阅读
- javascript - 如何从firebase正确显示表中的对象名称及其键
- liquibase - 如何在两个互斥的更改日志之间进行更改?
- flutter - 有没有办法通过 Onboarding Flutter 实现图像流效果?
- ios - UISlider 控制和反向的指数算法
- core-animation - UIView 的 animateKeyframes() 方法是否有类似 CAKeyframeAnimation 的 rotationMode rotateAuto 的选项
- javascript - 如何在 JavaScript 中检查序列何时重复?
- scheme - 无法弄清楚为什么我的代码没有针对这个问题运行
- uber-api - UBER - API/Deeeplink - 是否有添加多个停靠点的参数,比如pickup-location > stop > drop-off,就像在应用程序中一样?
- php - 条纹计划、客户、订阅创建。它不会创建重复项吗?
- python - 如何使用烧瓶下载 PDF