现在是比赛时间。
比赛项目
也许更有趣的是“哪种方法更快?”
第一项测试使用OP测试字符串(仅有3个块),第二项测试使用600个单字符块的字符串。
from collections import deque
import timeit
def trivial(s):
l = s.split()
return ' '.join(l[-1:] + l[:-1])
def more_split(s):
return ' '.join([s.split()[-1]] + s.split()[:-1])
def dq(s):
s_deq = deque(s.split())
s_deq.rotate(1)
return ' '.join(s_deq)
def find_and_slice(s):
lsi = s.rfind(' ')
return s[lsi+1:] + ' ' + s[:lsi]
def rs_lazy(s):
return ' '.join(reversed(s.rsplit(maxsplit=1)))
def rs_smart(s):
rs = s.rsplit(maxsplit=1)
return rs[1] + ' ' + rs[0]
def rpart(s):
part = s.rpartition(' ')
return part[-1] + part[1] + part[0]
def time_a_method(m, s):
c_arg = "('{}')".format(s)
t = timeit.timeit(m + c_arg, setup="from __main__ import " + m , number=100000)
print( m + " "*(15-len(m)) + "----> {}".format(t))
if __name__ == '__main__':
print(trivial("I Me You"))
print(more_split("I Me You"))
print(dq("I Me You"))
print(find_and_slice("I Me You"))
print(rs_lazy("I Me You"))
print(rs_smart("I Me You"))
print(rpart("I Me You"))
print("######## USE: 'I Me You'")
for m in ["trivial", "more_split", "dq", "find_and_slice", "rs_lazy", "rs_smart", "rpart"]:
time_a_method(m, "I Me You")
print("######## USE: 'a b c d e f '*100")
s = 'a b c d e f '*100
for m in ["trivial", "more_split", "dq", "find_and_slice", "rs_lazy", "rs_smart", "rpart"]:
time_a_method(m, s)
这将产生以下结果:
You I Me
You I Me
You I Me
You I Me
You I Me
You I Me
You I Me
######## USE: 'I Me You'
trivial ----> 0.1339518820000194
more_split ----> 0.1532761280000159
dq ----> 0.182199565000019
find_and_slice ----> 0.07563322400005745
rs_lazy ----> 0.23457759100006115
rs_smart ----> 0.1615759960000105
rpart ----> 0.06102836100001241
######## USE: 'a b c d e f '*100
trivial ----> 3.2239098259999537
more_split ----> 4.6946649449999995
dq ----> 3.991058845999987
find_and_slice ----> 0.15106809200005955
rs_lazy ----> 0.32278001499992115
rs_smart ----> 0.22939544400003342
rpart ----> 0.10590313199998036
获胜者是......
def rpart(s):
part = s.rpartition(' ')
return part[-1] + part[1] + part[0]
那让我感到惊讶(我打赌使用find_and_slice,但失败了)。有两个答案类别:
- 暴力法:将所有字符串分割
- 注意我们只需要字符串的最后一部分
即使在最简单的情况下
I Me You
,第一种方法也比最佳方法慢2至3倍。显然,当字符串变得更加有趣时,第一种方法变得非常低效。
真正有趣的事情是,得票最高的答案竟然是最慢的 :)
print(shift_right(sr)
这一行缺少了一个括号。你的第二个问题是append
会直接修改列表,所以不需要使用new_list=
。 - rlms