使用函数转换浮点值是性能瓶颈

时间:2014-08-15 11:22:48

标签: python python-2.7 numpy scipy

我有一个软件可以读取文件并使用函数(从numpy.polyfitnumpy.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)

1 个答案:

答案 0 :(得分:2)

如果不确切知道您的函数f正在做什么,就很难提出改进建议。你能分享吗?

但是,一般来说,许多NumPy操作在NumPy array对象上通常效果最好(读取:“最快”),而不是在单个值上重复多次时。

您可能会考虑将数字values[0]读入Python list,并将其传递给NumPy array并使用vectorisable NumPy操作获取array输出值。