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

我正在读一个大的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 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我尝试了你的建议,效果相当不错。谢谢