0

我已经完成了两种算法,我想检查其中哪一种更“高效”并且使用更少的内存。第一个创建一个 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 行)时不太稳定

谢谢!

4

3 回答 3

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 解决方案会比这更快。

于 2013-07-31T13:13:13.140 回答
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秒!谢谢。

于 2013-07-31T13:55:51.693 回答
0

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

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

对于这两种情况的一个建议:你真的不需要把所有的行都读到一个列表中。相反,如果您只是遍历文件,您将获得这些行而不将它们存储在内存中:

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

在内存使用方面,numpy array 明显优于 list。

于 2013-07-31T13:13:42.207 回答