如何编写更快的Python代码?

如何编写更快的Python代码?,python,list,python-2.x,Python,List,Python 2.x,我的代码 我的目标是两个比较列表,它们应该有相同的元素。 很好 with open('data1.txt','r') as f: lst = [int(line) for line in f] l1=lst[::3] l2=lst[1::3] l3=lst[2::3] print len(l1) print len(l2) print len(l3) b = [] for i in range(3200000): b.append(i+1) print len(b) m

我的代码

我的目标是两个比较列表,它们应该有相同的元素。 很好

with open('data1.txt','r') as f:
    lst = [int(line) for line in f]

l1=lst[::3]
l2=lst[1::3]
l3=lst[2::3]

print len(l1)
print len(l2)
print len(l3)

b = []
for i in range(3200000):
    b.append(i+1)

print len(b)

mapping = dict(zip(l1, b))
matches = [mapping[value] for value in l2 if value not in mapping]
print matches
但问题是代码非常慢,我以后会有更多的计算。如何改进这一点? 我的蟒蛇

3200000
3200000
3200000
3200000
[]

首先,我不明白这是怎么回事:

Python 2.7.6
我假设
总是在
映射中,并且数组总是空的。否则会抛出错误,因为找不到密钥

然后,在没有无用内存分配的情况下,尝试以下方法:

[mapping[value] for value in l2 if value not in mapping]

这在内存方面效率不高,但在执行速度方面效率很高。
似乎您没有使用l3。diff将包含两个列表中未包含的所有内容

mapping = {}
l2 = []

with open('data1.txt','r') as f:
    for i,line in enumerate(f):
        v = int(line)
        if i % 3 == 0:
            mapping[v] = i+1
        elif i % 3 == 1:
            l2.append(v)

matches = [mapping[value] for value in l2 if value not in mapping] # ??

print(matches)

慢到底有多慢?您的数据结构有多大?您使用的是Python2.x吗?如果是这样,请将
range
更改为
xrange
range
创建用于处理数据数组的列表eat内存。@haifzhan甚至更好,只需执行
b=xrange(3200000)
,无需构建列表,
zip
将消耗
xrange
。(显然,
print len(b)
必须删除)@RichardRublev您的代码正在运行。文件“b18.py”,第11行,在matches.append(mapping[v])KeyError:1207Yes,因为我的第一句话。我不知道你到底想要什么。请更正我放置“#???”的语句。再次更正问题。回溯(最后一次调用):文件“b20.py”,第10行,在l2[i]=v indexer中错误:列表分配索引超出范围现在我保留了您自己的行(复制并粘贴),只需根据您的需要更正该行。索引超出范围意味着
32000
不是正确的数字。如果长度可变,则添加
而不是首先填充数组。我为此做了编辑。不过,如果大小足够大,它可能会慢一些,因为它可能需要在其他地方重新分配更多内存。
import itertools
with open('data1.txt','r') as f:
    lines = map(int, f)

l1 = itertools.islice(lines, 0, None, 3)
l2 = itertools.islice(lines, 1, None, 3)
diff = set(l1) ^ set(l2)