IronPython与CPython的文件读取和解析性能

时间:2012-07-30 18:04:52

标签: python ironpython

我一直在使用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构造来解析文件行。这根本没有用。

感谢。

3 个答案:

答案 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)

结果:

  • CPython 2.7:1.282
  • CPython 3.3:1.562
  • IronPython 2.6 [.NET 2]:2.196
  • IronPython 2.7 [.NET 4]:2.880

IronPython运行吐出这个警告(不确定它是否会影响任何东西):

  

< string>:1:RuntimeWarning:IronPython不支持禁用   GC

当正在读取的文件(partest2.txt)被更改为具有相同的200,000个数字时,它们自己的行在这里是时间(完全不同)

  • CPython 2.7:4.04
  • CPython 3.3:7.61
  • IronPython 2.7 [.NET 4]:20.22
  • IronPython 2.6 [.NET 2]:21.46

YIKES!