我有一个软件可以读取文件并使用函数(从numpy.polyfit
和numpy.poly1d
函数派生)转换每行读取的每个第一个值。
此函数必须将转换后的文件写出来,我错误地(似乎)认为磁盘I / O部分是性能瓶颈。
我之所以声称正在减速的转变是因为我在将transformedValue = f(float(values[0]))
更改为transformedValue = 1000.00
之后测试了代码(如下所列)并且需要花费所需时间1分钟到10秒。
我想知道是否有人知道更有效的方法来执行这样的重复转换?
代码段:
def transformFile(self, f):
""" f contains the function returned by numpy.poly1d,
inputFile is a tab seperated file containing two floats
per line.
"""
with open (self.inputFile,'r') as fr:
for line in fr:
line = line.rstrip('\n')
values = line.split()
transformedValue = f(float(values[0])) # <-------- Bottleneck
outputBatch.append(str(transformedValue)+" "+values[1]+"\n")
joinedOutput = ''.join(outputBatch)
with open(output,'w') as fw:
fw.write(joinedOutput)
函数f
由另一个函数生成,该函数通过一组预期浮点数和一组测量浮点数拟合二次多项式。该函数的片段是:
# Perform 2d degree polynomial fit
z = numpy.polyfit(measuredValues,expectedValues,2)
f = numpy.poly1d(z)
- 答案 -
我修改了代码以在转换它们之前对值进行矢量化,从而显着提高了性能,代码现在如下:
def transformFile(self, f):
""" f contains the function returned by numpy.poly1d,
inputFile is a tab seperated file containing two floats
per line.
"""
with open (self.inputFile,'r') as fr:
outputBatch = []
x_values = []
y_values = []
for line in fr:
line = line.rstrip('\n')
values = line.split()
x_values.append(float(values[0]))
y_values.append(int(values[1]))
# Transform python list into numpy array
xArray = numpy.array(x_values)
newArray = f(xArray)
# Prepare the outputs as a list
for index, i in enumerate(newArray):
outputBatch.append(str(i)+" "+str(y_values[index])+"\n")
# Join the output list elements
joinedOutput = ''.join(outputBatch)
with open(output,'w') as fw:
fw.write(joinedOutput)
答案 0 :(得分:2)
如果不确切知道您的函数f
正在做什么,就很难提出改进建议。你能分享吗?
但是,一般来说,许多NumPy操作在NumPy array
对象上通常效果最好(读取:“最快”),而不是在单个值上重复多次时。
您可能会考虑将数字values[0]
读入Python list
,并将其传递给NumPy array
并使用vectorisable NumPy操作获取array
输出值。