使用set 和另一个列表理解:
a = range(1, 21)
b = set(range(5, 21, 4))
[i for i in a if i not in b]
# [1, 2, 3, 4, 6, 7, 8, 10, 11, 12, 14, 15, 16, 18, 19, 20]
您可以从第二个范围中删除 set,但我发现这比设置包含检查要慢:
函数
def chris(m):
a = range(1, m)
b = set(range(5, m, 4))
return [i for i in a if i not in b]
def chris2(m):
a = range(1, m)
b = range(5, m, 4)
return [i for i in a if i not in b]
def ollin(m):
return list(x for x in range(1,m) if x not in range(5,m,4))
def ollin2(m):
return list(x for x in range(1,m) if x == 1 or x % 4 != 1)
def smac(m):
return [v for i, v in enumerate(range(1,m)) if i == 0 or i % 4 != 0]
设置
from timeit import timeit
import pandas as pd
import matplotlib.pyplot as plt
res = pd.DataFrame(
index=['chris', 'chris2', 'ollin', 'ollin2', 'smac'],
columns=[10, 50, 100, 500, 1000, 5000, 10000],
dtype=float
)
for f in res.index:
for c in res.columns:
stmt = '{}(c)'.format(f)
setp = 'from __main__ import c, {}'.format(f)
res.at[f, c] = timeit(stmt, setp, number=50)
ax = res.div(res.min()).T.plot(loglog=True)
ax.set_xlabel("N");
ax.set_ylabel("time (relative)");
plt.show()