4种生成前n个整数列表的方法计时(探究)

醉少 发表于2019年09月26日
<p><code class="brush:python;toolbar:false" >def&nbsp;test1(): &nbsp;&nbsp;&nbsp;&nbsp;alist&nbsp;=&nbsp;[] &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;i&nbsp;in&nbsp;range(1000): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alist&nbsp;=&nbsp;alist&nbsp;+&nbsp;[i] def&nbsp;test2(): &nbsp;&nbsp;&nbsp;&nbsp;alist&nbsp;=&nbsp;[] &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;i&nbsp;in&nbsp;range(1000): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alist.append(i) from&nbsp;timeit&nbsp;import&nbsp;Timer t1&nbsp;=&nbsp;Timer(&quot;test1()&quot;,&quot;from&nbsp;__main__&nbsp;import&nbsp;test1&quot;) print(&quot;concat&nbsp;%f&nbsp;seconds&quot;&nbsp;%&nbsp;t1.timeit(number&nbsp;=&nbsp;10000)) t2&nbsp;=&nbsp;Timer(&quot;test2()&quot;,&quot;from&nbsp;__main__&nbsp;import&nbsp;test2&quot;) print(&quot;append&nbsp;%f&nbsp;seconds&quot;&nbsp;%&nbsp;t2.timeit(number&nbsp;=&nbsp;10000))</code>如果把test1()的语句&nbsp;alist&nbsp;=&nbsp;alist&nbsp;+&nbsp;[i] 改为&nbsp;alist +=&nbsp; [i],则时间复杂度为同一数量级</p>
2 回复

    1楼

  • 醉少 发表于2019年09月26日
    2 | 0 | 举报
    <p><img src="https://nos.netease.com/edu-image/5a319165c6044b248883ba5c4f5c67fc.png" style="width: 606px; height: 382px;" /></p><p><br /></p><p>执行结果如上图所示</p>
    醉少 发表于2019年09月26日
    添加评论
  • 2楼

  • 巨象_鹿 发表于2019年09月26日
    1 | 1 | 举报
    <p>试了下确实如此,然后百度了下:(不知是不是这个原因)</p><p>&nbsp;复合赋值算术运算符的重载<br ></p><p>&nbsp; &nbsp; &nbsp; &nbsp; 以复合赋值算术运算符 x += y为例,此运算符会优先调用x.__iadd__(y)方法,如果没有__iadd__方法时,则会将复合赋值算术运&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 算拆解为:x = x + y</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 然后调用x = x.__add__(y)方法,如果再不存在__add__方法则会触发TypeError类型的错误异常</p><p><br ></p><p>&nbsp; &nbsp; &nbsp; &nbsp; 复合赋值算术运算符的重载:</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 方法名&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 运算符和表达式&nbsp; &nbsp; &nbsp; 说明</p><p>&nbsp; &nbsp; &nbsp; &nbsp; __iadd__(self,rhs)&nbsp; &nbsp; &nbsp; &nbsp;self += rhs&nbsp; &nbsp; &nbsp; &nbsp; 加法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; __isub__(self,rhs)&nbsp; &nbsp; &nbsp; &nbsp;self -= rhs&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;减法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; __imul__(self,rhs)&nbsp; &nbsp; &nbsp; &nbsp;self *= rhs&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;乘法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; __itruediv__(self,rhs)&nbsp; &nbsp;self /= rhs&nbsp; &nbsp; &nbsp; &nbsp; 除法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; __ifloordiv__(self,rhs)&nbsp; self //=rhs&nbsp; &nbsp; &nbsp; &nbsp; 地板除</p><p>&nbsp; &nbsp; &nbsp; &nbsp; __imod__(self,rhs)&nbsp; &nbsp; &nbsp; &nbsp;self %= rhs&nbsp; &nbsp; &nbsp;取模(求余)</p><p>&nbsp; &nbsp; &nbsp; &nbsp; __ipow__(self,rhs)&nbsp; &nbsp; &nbsp; &nbsp;self **=rhs&nbsp; &nbsp; &nbsp; &nbsp;幂运算</p><p><br ></p>
    巨象_鹿 发表于2019年09月26日
    • 醉少 2019年09月27日
      0 | 举报
      这类似与C里面的自加自减,++i 或者i++这会在一个寄存器上操作
      醉少 发表于2019年09月27日
      0 | 举报
    添加评论