Python - 算法效率和稳定性

时间:2013-07-31 12:56:10

标签: python arrays performance memory stability

我已经完成了两个算法,我想检查哪一个更“高效”并且使用更少的内存。第一个创建一个numpy数组并修改数组。第二个创建一个python空数组并将值推送到此数组中。 谁更好? 第一个计划:

 f = open('/Users/marcortiz/Documents/vLex/pylearn2/mlearning/classify/files/models/model_training.txt')
        lines = f.readlines()
        f.close()
        zeros = np.zeros((60343,4917))

        for l in lines:
            row = l.split(",")
            for element in row:
                zeros[lines.index(l), row.index(element)] = element

        X = zeros[1,:]
        Y = zeros[:,0]
        one_hot = np.ones((counter, 2))

第二个:

 f = open('/Users/marcortiz/Documents/vLex/pylearn2/mlearning/classify/files/models/model_training.txt')
        lines = f.readlines()
        f.close()
        X = []
        Y = []

        for l in lines:
            row = l.split(",")
            X.append([float(elem) for elem in row[1:]])
            Y.append(float(row[0]))

        X = np.array(X)
        Y = np.array(Y)
        one_hot = np.ones((counter, 2))

我的理论是,第一个较慢,但使用较少的内存,并且在处理大文件时更“稳定”。第二个它更快,但使用大量内存,并且在处理大文件时不那么稳定(543MB,70,000行)

谢谢!

3 个答案:

答案 0 :(得分:1)

这两个代码的问题在于您首先使用file.readlines()将整个文件加载到内存中,您应该直接迭代文件对象以一次获得一行。

from itertools import izip
#generator function
def func():
   with open('filename.txt') as f:
       for line in f:
          row = map(float, l.split(","))
          yield row[1:], row[0]

X, Y = izip(*func())
X = np.array(X)
Y = np.array(Y)
...

我相信一个纯粹的numpy解决方案会比这更快。

答案 1 :(得分:1)

最后,由于答案,我做了一些改变。我的两个项目:

f = open('/Users/marcortiz/Documents/vLex/pylearn2/mlearning/classify/files/models/model_training.txt')
    zeros = np.zeros((60343,4917))
    counter = 0

    start = timeit.default_timer()
    for l in f:
        row = l.split(",")
        counter2 = 0
        for element in row:
            zeros[counter, counter2] = element
            counter2 += 1
        counter = counter + 1
    stop = timeit.default_timer()  
    print stop - start 
    f.close()

第一个节目的时间 - > 122.243036032秒

第二个程序:

f = open('/Users/marcortiz/Documents/vLex/pylearn2/mlearning/classify/files/models/model_training.txt')
    zeros = np.zeros((60343,4917))
    counter = 0

    start = timeit.default_timer()
    for l in f:
        row = l.split(",")
        counter2 = 0
        zeros[counter, :] = [i for i in row]
        counter = counter + 1
    stop = timeit.default_timer()
    print stop - start
    f.close()

第二个节目的时间:102.208696127秒! 感谢。

答案 2 :(得分:0)

Python在其默认库中有一个有用的profiler。它非常容易使用:只需将代码包装在一个函数中,然后按以下方式调用cProfile.run:

import cProfile
cProfile.run('my_function()')

对这两种情况提出一个建议:你真的不需要读取列表中的所有行。相反,如果你只是迭代文件,你将获得行而不将它们存储在内存中:

f = open('some_file.txt')
for line in f:
    # Do something

就内存使用而言,numpy数组明显优于list。