首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python:推项目与创建空列表(效率)

Python:推项目与创建空列表(效率)
EN

Stack Overflow用户
提问于 2013-07-31 12:56:10
回答 3查看 128关注 0票数 0

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

代码语言:javascript
运行
复制
 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))

第二项:

代码语言:javascript
运行
复制
 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))

我的理论是,第一个比较慢,但使用的内存更少,而且在处理大文件时更“稳定”。第二种,它速度更快,但占用大量内存,在处理大型文件(543 of,70000行)时,内存不太稳定。

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-07-31 13:55:51

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

代码语言:javascript
运行
复制
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秒

第二个节目:

代码语言:javascript
运行
复制
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秒!谢谢。

票数 1
EN

Stack Overflow用户

发布于 2013-07-31 13:13:13

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

代码语言:javascript
运行
复制
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)
...

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

票数 1
EN

Stack Overflow用户

发布于 2013-07-31 13:13:42

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

代码语言:javascript
运行
复制
import cProfile
cProfile.run('my_function()')

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

代码语言:javascript
运行
复制
f = open('some_file.txt')
for line in f:
    # Do something

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17971044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档