【发布时间】:2021-12-22 08:23:19
【问题描述】:
我需要处理一个非常大的 CSV 文件。
在此过程中,第一行需要特别注意。
因此,显而易见的代码是检查 csv 行中的值。 但这意味着对每一行(大约 200.000)进行字符串比较
另一种选择是设置一个布尔值并让布尔比较在“或”表达式中排在第一位。
两个选项如下:
import csv
def do_extra_processing():
pass
def do_normal_processing():
pass
if __name__ == "__main__":
with open('file.csv', newline='') as csvfile:
lines = csv.reader(csvfile, delimiter=';')
line_checked: bool = False
for line in lines:
# Check the first line: Option 1
if line[1] == "SomeValue":
# Every line of the 200000 lines does the string-compare
do_extra_processing()
do_normal_processing()
# Check the first line: Option 2
if (line_checked) or (line[1] == "SomeValue"):
# Every line of the 200000 lines does the boolean-compare first and does not evaluate the string compare
do_extra_processing()
line_checked = True
do_normal_processing()
我已经检查过,在“或”表达式中,当第一部分为 True 时,不会计算第二部分。
布尔值在 for 循环上方初始化,并在 extra_processing 完成时在 if 语句中设置。
问题是:使用 bool-compare 的第二个选项明显更快吗?
(无需转换为 ,与37615264 的问题不同)
【问题讨论】:
-
您好!你能解释一下如何以及在哪里设置布尔值吗?布尔值总是比字符串比较快
-
感谢@Charley 的快速回复。我已经编辑了问题并解释了布尔值的设置位置。
-
您的布尔值将保持 True,因为您不会将其重置为 false,因此额外的处理只进行一次。这似乎不是你想要的?所以第二个选项不起作用,似乎不可能实现和抑制字符串比较。
-
你说“在这个过程中,第一行需要特别注意”。那么你应该使用
not line_checked and ...而不是not line_checked or ...吗?我认为布尔值的重点是避免字符串比较和除第一行之外的所有行的额外处理,但这不是你的代码or所做的。 -
@BertC 它的作用已经很清楚了。不清楚的是你为什么要这样做。我的意思是,您的 bool 的效果是,在第一行中您检查 bool 而不是比较两个字符串,这样可以节省一点,但这是以 additional bool 检查为代价的 每隔 行(您仍然对所有这些行进行字符串比较)。这似乎是一个明显的坏主意,而且不清楚你为什么要考虑。
标签: python