Python 有没有办法提高大文件解析日期的速度?
我正在读一个大的csv文件,它大约有1B行。我在解析日期时遇到了问题。Python的处理速度很慢 文件中的一行如下所示:,Python 有没有办法提高大文件解析日期的速度?,python,performance,cython,Python,Performance,Cython,我正在读一个大的csv文件,它大约有1B行。我在解析日期时遇到了问题。Python的处理速度很慢 文件中的一行如下所示:, '20170427,20:52:01.510,美国广播公司,美元/墨西哥比索,1,报价,19.04274900000,9@15@8653948257753368229,0.0\n' 如果我只查看数据,需要1分钟 t0 = datetime.datetime.now() i = 0 with open(r"QuoteData.txt") as file: for li
'20170427,20:52:01.510,美国广播公司,美元/墨西哥比索,1,报价,19.04274900000,9@15@8653948257753368229,0.0\n'
如果我只查看数据,需要1分钟
t0 = datetime.datetime.now()
i = 0
with open(r"QuoteData.txt") as file:
for line in file:
i+=1
print(i)
t1 = datetime.datetime.now() - t0
print(t1)
129908976
0:01:09.871744
但是如果我试图解析datetime,则需要8分钟
t0 = datetime.datetime.now()
i = 0
with open(r"D:\FxQuotes\ticks.log.20170427.txt") as file:
for line in file:
strings = line.split(",")
datetime.datetime(
int(strings[0][0:4]), # %Y
int(strings[0][4:6]), # %m
int(strings[0][6:8]), # %d
int(strings[1][0:2]), # %H
int(strings[1][3:5]), # %M
int(strings[1][6:8]), # %s
int(strings[1][9:]), # %f
)
i+=1
print(i)
t1 = datetime.datetime.now() - t0
print(t1)
129908976
0:08:13.687000
split()
大约需要1分钟,日期解析大约需要6分钟。有什么可以改进的吗?@TemporalWolf建议使用。我从来没听说过,所以我想试试
首先,我用你们的样品线测试了我的笔记本电脑。我制作了一个包含1000万行的CSV文件,读取所有内容大约需要6秒钟。使用您的日期解析代码可以将时间延长到48秒,这是有意义的,因为您还报告需要8倍的时间。然后我将文件缩小到一百万行,我可以在0.6秒内读取它,在4.8秒内解析日期,所以一切看起来都正常
然后我切换到ciso8601
,几乎像魔术一样,一百万行的时间从4.8秒变为1.9秒:
import datetime
import ciso8601
t0 = datetime.datetime.now()
i = 0
with open('input.csv') as file:
for line in file:
strings = line.split(",")
d = ciso8601.parse_datetime('%sT%s' % (strings[0], strings[1]))
i+=1
print(i)
t1 = datetime.datetime.now() - t0
print(t1)
请注意,您的数据几乎已经是iso8601格式。我只需要把日期和时间和中间的“T”放在一起。你可以看一下。它将允许您在多个线程之间拆分进程—实际上,您可以随意拆分,因此请注意cpu/mem上限。您是否必须将日期转换为实际的datetime对象?
line[:s.index(',')]
以更快地获得日期?或者,如果每行的格式相同,只需在硬编码索引上切片即可<代码>行[0:8]@Grimmy我需要将文件中的时间与其他时间进行比较,以确定数据是否适合使用。查看复制目标。为ciso8601格式化字符串时,您可能需要对字符串进行一些修改,但它比其他方法快得多。这种split
也会增加15%的持续时间。如果他只想检查日期,我们可以访问行[0:8]
csv模块是否会提高速度?根据我的经验,%s%s%(str1,str2)
是连接字符串的较慢方式之一。事实上,在这种情况下,直接连接速度更快:parse_datetime(strings[0]+''+strings[1])
。另外,从ciso8601导入的parse_datetime
省去了每次调用都要查找引用的麻烦,这比ciso8601.parse_datetime()更快。
此外,切片字符串(如Grimmy提到的)在任何其他优化的基础上将时间缩短了近一半。注意,这些比较取决于版本。@TemporalWolf我尝试了你的建议,效果相当不错。谢谢