我有一个非常大的python脚本,200K,我想尽可能少使用内存.它看起来像:
# a lot of data structures
r = [34, 78, 43, 12, 99]
# a lot of functions that I use all the time
def func1(word):
    return len(word) + 2
# a lot of functions that I rarely use
def func1(word):
    return len(word) + 2
# my main loop
while 1:
   # lots of code
   # calls functions
如果我把我很少使用的函数放在模块中,并且只在必要时动态导入它们,我就无法访问数据.就我而言,这就是我的意思.
我是python的新手.
任何人都可以把我放在正确的道路上吗?如何打破这个大脚本,以便它使用更少的内存?是否值得将很少使用的代码放在模块中,只在需要时调用它们?
我试图扭转所给出的索引,enumerate同时保留列举的列表的原始顺序.
假设我有以下内容:
>> range(5)
[0, 1, 2, 3, 4]
如果我列举这个,我会得到以下内容:
>> list(enumerate(range(5)))
[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)]
但是我想要反转枚举提供的索引,以便得到:
[(4, 0), (3, 1), (2, 2), (1, 3), (0, 4)]
到目前为止,我有以下代码:
reversed(list(enumerate(reversed(range(5)))))
我只是想知道是否有更简洁的方法来做到这一点?
我有一个方法,它接受一个String参数,并使用NLTK将字符串分解为句子,然后分成单词.然后,它将每个单词转换为小写,最后创建每个单词频率的字典.
import nltk
from collections import Counter
def freq(string):
    f = Counter()
    sentence_list = nltk.tokenize.sent_tokenize(string)
    for sentence in sentence_list:
        words = nltk.word_tokenize(sentence)
        words = [word.lower() for word in words]
        for word in words:
            f[word] += 1
    return f
我应该进一步优化上面的代码,以加快预处理时间,并且不确定如何这样做.返回值显然应该与上面的完全相同,所以我希望使用nltk虽然没有明确要求这样做.
有什么方法可以加快上面的代码?谢谢.
要在数字矩阵中找到最大值,我们可以编码5行来解决问题:
ans = matrix[0][0]
for x in range(len(matrix)):
    for y in range(len(matrix[0])):
        ans = max(ans, matrix[x][y])
return ans
这个问题有一个单行解决方案吗?我提出的那个实际上非常尴尬:
return max(max(matrix, key=max))
要么
return max(map(max, matrix))
考虑从大型csv文件(80 MB)返回的大型命名项(第一行),其中可能存在间断间隔
name_line =  ['a',,'b',,'c' .... ,,'cb','cc']
我正在逐行读取剩余的数据,我只需要处理具有相应名称的数据.数据可能看起来像
data_line =  ['10',,'.5',,'10289' .... ,,'16.7','0']
我尝试了两种方法.一个是从读取的每一行弹出空列
blnk_cols = [1,3, ... ,97]
while data:
    ...
    for index in blnk_cols: data_line.pop(index)
另一个是编译与L1名称关联的项目
good_cols = [0,2,4, ... ,98,99]   
while data:
    ...
    data_line = [data_line[index] for index in good_cols]
在我使用的数据中肯定会有更好的线条然后坏线虽然它可能高达一半和一半.
我使用cProfile和pstats包来确定我速度最弱的链接,这表明pop是当前最慢的项目.我切换到列表comp,时间几乎加倍.
我想象一种快速的方法是切片检索只有好数据的数组,但对于具有交替空白和良好数据的文件来说这会很复杂.
我真正需要的是能够做到的
data_line = data_line[good_cols]
有效地将索引列表传递到列表中以获取这些项目.现在我的程序在大约2.3秒内运行10 MB文件,弹出帐户大约0.3秒.
是否有更快的方式来访问列表中的某些位置.在C中,它只是取消引用指向数组中正确索引的指针数组.
添加:读取前的文件中的name_line
a,b,c,d,e,f,g,,,,,h,i,j,k,,,,l,m,n,
读取和拆分后的name_line(",")
['a','b','c','d','e','f','g','','','','','h','i','j','k','','','','l','m','n','\n']
我有这样的文件格式:
9 8 1
3 4 1
...
...
现在,我希望将每一行作为三个整数.
我用的时候
for line in f.readlines():
    print line.split(" ")
脚本打印了这个:
['9', '8', '1\r\n']
['3', '4', '1\r\n']
...
...
如何将每一行作为三个整数?
有一个列表:nodes = [20,21,22,23,24,25].
我使用两种方法来生成新的二维对象:
tour1 = (((a,b) for a in nodes )for b in nodes)
tour2 = [[(a,b) for a in nodes ]for b in nodes]
tour1的类型是生成器,而tour2是列表:
In [34]: type(tour1)
Out[34]: <type 'generator'>
In [35]: type(tour2)
Out[35]: <type 'list'>
我想知道为什么tour1不是一个元组?谢谢.
我正在尝试2.6的集合理解,并遇到了以下两种方式.我认为第一种方法比第二种方法更快,timeit否则建议.为什么第二种方法更快,即使第二种方法有一个额外的列表实例化后跟一组实例化?
方法1:
In [16]: %timeit set(node[0] for node in pwnodes if node[1].get('pm'))
1000000 loops, best of 3: 568 ns per loop
方法2:
In [17]: %timeit set([node[0] for node in pwnodes if node[1].get('pm')]) 
1000000 loops, best of 3: 469 ns per loop
哪里pwnodes = [('e1', dict(pm=1, wired=1)), ('e2', dict(pm=1, wired=1))].
我认为我忽略了一些简单的事情,但似乎无法弄清楚到底是什么。请考虑以下代码:
a = [2, 3, 4, 5]
lc = [ x for x in a if x >= 4 ] # List comprehension
lg = ( x for x in a if x >= 4 ) # Generator expression
a.extend([6,7,8,9])
for i in lc:
    print("{} ".format(i), end="")
for i in lg:
    print("{} ".format(i), end="")
我希望两个for循环都会产生相同的结果,所以4 5。但是,打印生成器exp的for循环会打印4 5 6 7 8 9。我认为这与列表理解的声明(在扩展之前声明)有关。但是,为什么生成器的结果与在扩展列表之前也声明过的不同呢?例如内部发生了什么?
有没有经验与pycassa合作的人我对它有疑问.如何获取存储在数据库中的所有密钥?
好吧,在这个小片段中,我们需要给出键以获得相关的列(这里的键是'foo'和'bar'),这很好,但我的要求是一次获取所有键(仅键)作为Python列表或类似的数据结构.
cf.multiget(['foo', 'bar'])
{'foo': {'column1': 'val2'}, 'bar': {'column1': 'val3', 'column2': 'val4'}}
谢谢.