python中计算代价1

算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。
渐近时间复杂度简称时间复杂度,用大O计数法表示,即O(n).n为处理实例问题的规模.

在python程序中计算的代价(复杂度):

  1. 基本算术运算是常量时间操作,逻辑运算是常量时间运算.(准确来说,浮点数算术运算应该认为是常量时间操作.python语言中int类型可以表示任意大小的整数值,实际上时通过软件实现的.超过一定范围后,整数越大,一次算术运算耗费时间越长)
  2. 组合对象的操作有些是常量时间的,有些不是,例如复制和切片通常需要线性时间(与长度有关,是O(n)时间操作),list和tuple的元素访问和元素赋值,是常量时间的(O(1)),dict操作情况比较复杂:最坏情况时O(n),平均时间复杂度是O(1)
  3. 字符串应该看做组合对象,其许多操作不是常量时间的.
  4. 创建对象也需要付出时间和空间,时间和空间代价都与对象大小有关.对于组合对象,这里可能有需要构造的一个个元素,元素有大小问题,整体看还有元素个数问题.通常应看做线性时间和线性空间操作(以元素个数为规模)

注意点:

  1. python中各种组合数据对象都没有预设的最大元素个数.在实际使用中,这些结构能根据元素的个数的增长自动扩充存储空间.从空间占用的角度看,其实际开销在存续期间可能变大,但通常不会自动缩小(即使后来元素变得很少了).举个例子,假设程序建了一个表,而后不断加入元素导致表变得很大,而后又不断删除元素,后来表中元素变得很少,但占用的存储空间并不减少.
  2. 还应注意python自动存储管理系统的影响.举个例子:如果在程序里建立了一个表,此后一直将其作为某个全局变量的值,这个对象就会始终存在并占用存储空间.如果将其作为某个函数里局部变量的值,或者虽然作为全局变量的值,但后来通过赋值将其抛弃,这个表对象就可以被回收.
import time

# 18s
def test1(n):
    start = time.clock()
    lst = []
    for i in range(10000*n):
        lst = lst + [i]
    stop = time.clock()
    print(stop - start)
    return

# 0.009s
def test2(n):
    start = time.clock()
    lst = []
    for i in range(10000*n):
        lst.append(i)
    stop = time.clock()
    print(stop - start)
    return

# 0.005s
def test3(n):
    start = time.clock()
    l = [i for i in range(10000*n)]
    stop = time.clock()
    print(stop - start)
    return

# 0.0025s
def test4(n):
    start = time.clock()
    l = list(range(10000 * n))
    stop = time.clock()
    print(stop - start)
    return

test1(10)
test2(10)
test3(10)
test4(10)


同样的获取一个0到100000的列表,所需时间相差极大.所以在有良好的算法基础上还得应用合适的数据结构来实现.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值