注:主要是在看别人代码时候遇见之前没有用过的标准库,或者用过但仍然不熟悉的,记录下来。
引子代码:MOOC课后讨论
from itertools import permutations
def violence(s1, s2):
s1s = [''.join(x) for x in permutations(s1)]
if s2 in s1s:
return True
else:
return False
--------------------------------------------------------
from timeit import timeit
from string import ascii_lowercase
from random import sample
import matplotlib.pyplot as plt
durations = []
for n in range(1, 11):
s1 = ''.join(sample(ascii_lowercase, n))
s2 = ''.join(sample(([ascii_lowercase, s1])[n%2], n))
flag = ('是' if violence(s1, s2) else '非') + '变位词'
duration = timeit('violence(s1, s2)',
setup='from __main__ import violence, s1, s2',
number=1)
durations.append(duration)
print(f'{s1} 与 {s2} {flag}')
plt.plot(range(1, n+1), durations)
plt.xticks(range(1, n+1))
plt.xlabel('n')
plt.ylabel('t(s)')
1,itertools库
permutations函数:返回给定参数的全部排列组合
2,string库
ascii_lowercase属性:返回所有英文小写字母
3, timeit库
timeit函数:相比于传统time更好的计算小段代码片的计时器
timeit.timeit(stmt=‘pass’, setup=‘pass’, timer=< default timer>, number=1000000, globals=None)
例子:
timeit.timeit(setup='"_".join(str(n) for n in range(1000))', number=1000 )
解读:
其实常规用法应该是
from timeit import Timer
# 实例化Timer对象
t1 = Timer(" ", " ") # 第一个参数是执行的语句, 第二个是setup:导入第一个语句中所需要的变量
# 调用对象的timeit函数
print(t1.timeit(number=1000)
如下代码:
from timeit import Timer
from timeit import timeit
def test1():
l = []
for i in range(10000):
l = l + [i]
def test2():
l = []
for i in range(10000):
l.append(i)
def test3():
l = [i for i in range(10000)]
def test4():
l = list(range(10000))
常规:
t1 = Timer("test1()", "from __main__ import test1")
print('concat %f seconds\n' % t1.timeit(number=1000))
简便:
print('concat %f seconds\n' % timeit("test1()", "from __main__ import test1", number =1000))
print('concat %f seconds\n' % timeit("test2()", "from __main__ import test2", number =1000))
print('concat %f seconds\n' % timeit("test2()", "from __main__ import test3", number =1000))
print('concat %f seconds\n' % timeit("test2()", "from __main__ import test4", number =1000))