我一直在使用python中的文件阅读器,我期望读取ascii文件~100MB。顶部有一堆标题信息,然后只有制表符分隔的列。有些列包含非数字数据(我现在不关心)。我有一个matlab实现,在不到1.5秒的时间内读取30MB的样本文件。我的python阅读器在CPython中大约需要2秒,但在IronPython中大约需要4秒。差异似乎是字符串值转换浮点数的地方,但我无法让它在IronPython中更快。
我最近的迭代有以下循环来读取和解析行
#-Parse the actual data lines
istep = -1
while len(line) > 0:
istep += 1
#-Split the line and convert pasred values to floats
timestep = line.split();
for ichan in numericChannels:
data[ichan].append(float(timestep[ichan]))
line = f.readline().strip()
numericChannels
是一个整数列表,指定我想要读取的通道。 data
是列表,其中子列表是一列数据。
性能差异似乎来自浮动转换。关于我可以在IronPython上做些什么来加快速度的想法?我甚至尝试过读取文件,然后使用System.Threading.Task.Parallel.ForEach构造来解析文件行。这根本没有用。
感谢。
答案 0 :(得分:0)
a)你说“差异似乎是字符串值被转换为浮动的地方” - 是什么让你这么想?你在代码上运行了一个分析器吗?
b)如果你有记忆,那么做起来可能会更快
for line in f.readlines():
答案 1 :(得分:0)
在我看来,这样的东西可能更快一些。
import operator
data=[]
istep = -1
columngetter=operator.itemgetter(*numericChannels)
while len(line) > 0:
istep += 1
#-Split the line and convert parsed values to floats
timestep = line.split()
data.append(map(float,columngetter(timestep)))
line = f.readline().strip()
data=zip(*data)
答案 2 :(得分:0)
看起来IronPython比CPython读取文本文件要慢。我在几个版本的Python中运行了这个代码段(partest2.txt文件在一行中给出了200,000个数字):
import sys
import timeit
tmr = timeit.Timer("with open(r'partest2.txt','r') as fid:fid.readlines()")
res = tmr.timeit(number=20)
print(res)
结果:
IronPython运行吐出这个警告(不确定它是否会影响任何东西):
< string>:1:RuntimeWarning:IronPython不支持禁用 GC
当正在读取的文件(partest2.txt)被更改为具有相同的200,000个数字时,它们自己的行在这里是时间(完全不同)
YIKES!