这是一个将一些可能的方法与 2 个不同数据集进行比较的答案,一个由许多小数组组成,另一个由几个大数组组成:
导入时间
随机导入
从 itertools 导入链
def f1(a, b):
return list(chain.from_iterable(zip(a, b)))
def f2(a, b):
return list(sum(zip(a, b), ()))
def f3(a, b):
result = []
for (e1, e2) in zip(a, b):
result += [e1, e2]
return result
def f4(a, b):
result = []
len_result = min(len(a), len(b))
result = []
i = 0
while i < len_result:
result.append(a[i])
result.append(b[i])
i += 1
return result
# Small benchmark
N = 5000000
a_small = ['a', 'b', 'c', 'd']
b_small = ['e', 'f', 'g', 'h']
benchmark1 = [
timeit.timeit(
'f1(a_small, b_small)', setup='from __main__ import f1, a_small,b_small', number=N),
timeit.timeit(
'f2(a_small, b_small)', setup='from __main__ import f2, a_small,b_small', number=N),
timeit.timeit(
'f3(a_small, b_small)', setup='from __main__ import f3, a_small,b_small', number=N),
timeit.timeit(
'f4(a_small, b_small)', setup='from __main__ import f4, a_small,b_small', number=N)
]
for index, value in enumerate(benchmark1):
print " - Small sample with {0} elements -> f{1}={2}".format(len(a_small), index + 1, value)
# Large benchmark
N = 5000
K = 100000
P = 1000
a_large = random.sample(range(K), P)
b_large = random.sample(range(K), P)
benchmark2 = [
timeit.timeit(
'f1(a_large, b_large)', setup='from __main__ import f1, a_large,b_large', number=N),
timeit.timeit(
'f2(a_large, b_large)', setup='from __main__ import f2, a_large,b_large', number=N),
timeit.timeit(
'f3(a_large, b_large)', setup='from __main__ import f3, a_large,b_large', number=N),
timeit.timeit(
'f4(a_large, b_large)', setup='from __main__ import f4, a_large,b_large', number=N)
]
for index, value in enumerate(benchmark2):
print " - Large sample with {0} elements -> f{1}={2}".format(K, index + 1, value)
- 4 个元素的小样本 -> f1=7.50175959666
- 4 个元素的小样本 -> f2=5.52386084127
- 4 个元素的小样本 -> f3=7.12457549607
- 4 个元素的小样本 -> f4=7.24530968309
- 100000 个元素的大样本 -> f1=0.512278885906
- 包含 100000 个元素的大样本 -> f2=28.0679210232
- 包含 100000 个元素的大样本 -> f3=1.05977378475
- 100000 个元素的大样本 -> f4=1.17144886156
结论:当 N 很大并且列表很少时,f2 函数似乎是稍微快一些的方法。当数组很大并且数量很少时,f1 是赢家。
规格:Python2.7.11(64),在 i-7 2.6Ghz 上 N=5000000