如何编写更快的 Python 代码?
How to write faster Python code?
我的代码
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
[]
但问题是代码很慢,我会进行更多计算 later.How 来改进它吗?
我的 python
Python 2.7.6
首先,我不知道它是如何工作的:
[mapping[value] for value in l2 if value not in mapping]
我想 value
总是在 mapping
中并且数组总是空的。否则它应该抛出错误,因为找不到密钥。
然后,尝试这样的事情,没有无用的内存分配:
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)
这在内存方面效率不高,但在执行速度方面非常高效。
好像你不使用 l3。 diff 将包含两个列表中未包含的所有内容。
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)
我的代码
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
[]
但问题是代码很慢,我会进行更多计算 later.How 来改进它吗? 我的 python
Python 2.7.6
首先,我不知道它是如何工作的:
[mapping[value] for value in l2 if value not in mapping]
我想 value
总是在 mapping
中并且数组总是空的。否则它应该抛出错误,因为找不到密钥。
然后,尝试这样的事情,没有无用的内存分配:
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)
这在内存方面效率不高,但在执行速度方面非常高效。
好像你不使用 l3。 diff 将包含两个列表中未包含的所有内容。
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)