有没有办法提高大文件解析日期的速度?

时间:2017-05-01 21:17:11

标签: python performance cython

我正在阅读一个大约有1B行的大型csv文件。我遇到了解析日期的问题。 Python的处理速度很慢。

文件中的单行如下所示,     '20170427,20:52:01.510,ABC,USD/MXN,1,OFFER,19.04274,9000000,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

但如果我试图解析日期时间,则需要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分钟。我有什么办法可以改善这个吗?

1 个答案:

答案 0 :(得分:3)

@TemporalWolf有使用ciso8601的极好建议。我从来没有听说过,所以我想我试一试。

首先,我使用您的样品线对我的笔记本电脑进行基准测试。我制作了一个包含1000万行精确行的CSV文件,大约需要6秒才能读取所有内容。使用你的日期解析代码带来了最多48秒,这是有道理的,因为你还报告它花了8倍的时间。然后我将文件缩放到100万行,我可以在0.6秒内读取它并在4.8秒内解析日期,所以一切看起来都正确。

然后我切换到ciso8601,几乎像魔术一样,100万行的时间从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”放在一起。