Python 算法.2
如果 a+b+c=1000,且 a^2+b^2=c^2(a,b,c 为自然数),如何求出所有a、b、c可能的组合?
import time
start_time = time.time()
# 注意是三重循环for a in range(0, 1001): for b in range(0, 1001): for c in range(0, 1001): if a**2 + b**2 == c**2 and a+b+c == 1000: print("a, b, c: %d, %d, %d" % (a, b, c))
end_time = time.time()print("elapsed: %f" % (end_time - start_time))print("complete!")
直接三层循环进行暴力算
时间复杂度:
T(n) = O(n*n*n) = O(n3)
import time
start_time = time.time()
# 注意是两重循环for a in range(0, 1001): for b in range(0, 1001-a): c = 1000 - a - b if a**2 + b**2 == c**2: print("a, b, c: %d, %d, %d" % (a, b, c))
end_time = time.time()print("elapsed: %f" % (end_time - start_time))print("complete!")
优化
时间复杂度:
T(n) = O(n*n*(1+1)) = O(n*n) = O(n2)
这里具体的自己去看书,我直接说出结论

常见的时间复杂度
O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n3) < O(2n) < O(n!) < O(nn)
详细的工具先不推荐,这里先用自带的time模块去计算:
timeit模块
timeit模块可以用来测试一小段Python代码的执行速度。
class timeit.Timer(stmt='pass', setup='pass', timer=<timer function>)Timer是测量小段代码执行速度的类。
stmt参数是要测试的代码语句(statment);
setup参数是运行代码时需要的设置;
timer参数是一个定时器函数,与平台有关。
timeit.Timer.timeit(number=1000000)Timer类中测试语句执行速度的对象方法。number参数是测试代码时的测试次数,默认为1000000次。方法返回执行代码的平均耗时,一个float类型的秒数。
from timeit import Timer
def test1(): l = [] for i in range(1000): l = l + [i]
def test2(): l = [] for i in range(1000): l.append(i)
def test3(): l = [i for i in range(1000)]
def test4(): l = list(range(1000))
t1 = Timer("test1()", "from __main__ import test1")print("concat ", t1.timeit(number=1000), "seconds")t2 = Timer("test2()", "from __main__ import test2")print("append ", t2.timeit(number=1000), "seconds")t3 = Timer("test3()", "from __main__ import test3")print("comprehension ", t3.timeit(number=1000), "seconds")t4 = Timer("test4()", "from __main__ import test4")print("list range ", t4.timeit(number=1000), "seconds")

这里就完成了一个简单的性能分析
from timeit import Timer
def function(): passT1 = Timer("function()", "from __main__ import function")print("你的打印字符:", T4.timeit(number=1000), "seconds")

这里尝试给出一个测量模块的模板
x = range(2000000)pop_zero = Timer("x.pop(0)","from __main__ import x")print("pop_zero ",pop_zero.timeit(number=1000), "seconds")
x = range(2000000)pop_end = Timer("x.pop()","from __main__ import x")print("pop_end ",pop_end.timeit(number=1000), "seconds")
pop是我们list经常使用的方法之一
我们可以通过例子看到在表头和表尾插入的时间比较

这里给出列表相关方法的时间复杂度

因为除了列表以外,我们的映射数据类型也是常见的所以这里给出dict的相关复杂度
赞 (0)
