您可以使用二进制搜索来查找开关索引:
from bisect import bisect_left
switchIndex = bisect_left(list1, switchValue)
然后在不使用Python循环的情况下打印(哦,在Python 2中不起作用,但下面的另一个可以):
print(*list1[:switchIndex], sep='\n')
print(*list2, sep='\n')
或者:
print('\n'.join(map(str, list1[:switchIndex])))
print('\n'.join(map(str, list2)))
在Python 2中,在10万倍长的列表上与您和deceze的列表一起进行基准测试:
51 ms 52 ms 52 ms Kelly2
137 ms 138 ms 138 ms original
138 ms 138 ms 138 ms deceze1
160 ms 160 ms 161 ms deceze2
164 ms 164 ms 165 ms deceze3
在Python 3中:
111 ms 114 ms 114 ms Kelly2
134 ms 134 ms 135 ms Kelly1
176 ms 177 ms 178 ms deceze1
178 ms 178 ms 178 ms original
189 ms 189 ms 191 ms deceze2
191 ms 192 ms 192 ms deceze3
(不包括@buhtz's,因为它不太具有可比性。)
基准代码(
Try it online!
-
Python 2 version
):
def original():
for i in list1:
if i < switchValue:
print(i)
else:
for j in list2:
print(j)
break
def deceze1():
for i in list1:
if i >= switchValue:
break
print(i)
for i in list2:
print(i)
def deceze2():
for i in takewhile(lambda i: i < switchValue, list1):
print(i)
for i in list2:
print(i)
def deceze3():
for i in chain(takewhile(lambda i: i < switchValue, list1), list2):
print(i)
def Kelly1():
switchIndex = bisect_left(list1, switchValue)
print(*list1[:switchIndex], sep='\n')
print(*list2, sep='\n')
def Kelly2():
switchIndex = bisect_left(list1, switchValue)
print('\n'.join(map(str, list1[:switchIndex])))
print('\n'.join(map(str, list2)))
funcs = original, deceze1, deceze2, deceze3, Kelly1, Kelly2
import os, sys
from timeit import default_timer as timer
from bisect import bisect_left
from itertools import takewhile, chain
list1 = [1, 3, 5, 8]
list2 = [7, 10, 12]
switchValue = 4
for func in funcs:
print(func.__name__ + ':')
func()
n = 100_000
list1 = [x for x in list1 for _ in range(n)]
list2 = [x for x in list2 for _ in range(n)]
print('benchmark:')
tss = [[] for _ in funcs]
for _ in range(10):
for func, ts in zip(funcs, tss):
with open(os.devnull, 'w') as sys.stdout:
t0 = timer()
func()
t1 = timer()
sys.stdout = sys.__stdout__
ts.append(t1 - t0)
ts.sort()
for func, ts in sorted(zip(funcs, tss), key=lambda x: x[1]):
print(*('%d ms ' % (t * 1e3) for t in sorted(ts)[:3]), func.__name__)