当前位置: 首页 > 面试题库 >

总的来说可以更快

上官霄
2023-03-14
问题内容

这是对该问题的后续跟踪

因此,首先,您会注意到无法sum对要连接的字符串列表执行,python告诉您改为使用str.join,这是个好建议,因为无论您如何+在字符串上使用,性能都很差。

“不能使用sum”限制不适用于list,尽管这itertools.chain.from_iterable是执行这种列表平整的首选方法。

但是sum(x,[])什么时候x是列表绝对是不好的。

但是它应该保持这种状态吗?

我比较了三种方法

import time
import itertools

a = [list(range(1,1000)) for _ in range(1000)]

start=time.time()
sum(a,[])
print(time.time()-start)

start=time.time()
list(itertools.chain.from_iterable(a))
print(time.time()-start)


start=time.time()
z=[]
for s in a:
    z += s
print(time.time()-start)

结果:

  • sum()在清单清单上:10.46647310256958。好吧,我们知道。
  • itertools.chain:0.07705187797546387
  • 使用就地加法的自定义累积总和:0.057044029235839844(可能比itertools.chain您看到的快)

所以,sum是远远落后,因为它执行result = result + b的,而不是result += b

所以现在我的问题是:

sum如果可用,为什么不能使用这种累积方法?

(这对于已经存在的应用程序将是透明的,并使使用sum内置函数有效地展平列表成为可能)


问题答案:

我们可以尝试使 sum() 更智能,但Alex Martelli和Guido van Rossum希望将其重点放在算术求和上。

FWIW,您应该使用以下简单代码获得合理的性能:

result = []
for seq in mylists:
    result += seq

对于您的另一个问题,“为什么总不能使用这种累加方法?”,请参见Python / bltinmodule.c中关于builtin_sum()的注释:

    /* It's tempting to use PyNumber_InPlaceAdd instead of
       PyNumber_Add here, to avoid quadratic running time
       when doing 'sum(list_of_lists, [])'.  However, this
       would produce a change in behaviour: a snippet like

         empty = []
         sum([[x] for x in range(10)], empty)

       would change the value of empty. */


 类似资料:
  • 问题内容: 如何使用JS更改视频的来源? 问题答案: 当然,您可以在元素上设置属性: 或使用jQuery代替标准DOM方法:

  • 既然字符串是不可变的,我们如何将字符串更改为示例 现在我正在做 它将打印“你好玛纳斯”。所以字符串s1会改变。 那么,你怎么能说字符串是不可变的呢?

  • 面经总结: 楼主自我介绍: 楼主普通211本科 ,24届 非科班 java后端开发方向 lc300道 于去年10月开始准备找实习。 于12月面上北京一家中厂,方向是搜索引擎开发方向。在这两个月的实习期间主要参与了由ES搭建的搜索引擎。也由此在这段期间学习了ES与mq的相关知识。 于2月正式开始准备下一段的实习求职过程,这一个月每周都几乎4次面试,强度虽然拉满了,但是也是真的开心,因为去年12月投简

  • 本文向大家介绍来说说你对重绘和重排的理解,以及如何优化?相关面试题,主要包含被问及来说说你对重绘和重排的理解,以及如何优化?时的应答技巧和注意事项,需要的朋友参考一下 浏览器加载网页时会生成DOM树和CSSOM树 重绘: 当盒子的位置、大小以及其他属性,例如颜色、字体大小等都确定下来之后,浏览器便把这些原色都按照各自的特性绘制一遍,将内容呈现在页面上。重绘是指一个元素外观的改变所触发的浏览器行为,

  • 问题内容: 当我使用maven- hibernate3-plugin(又名hbm2ddl)生成数据库架构时,它会创建许多数据库约束,并且具有难以理解的约束名称,例如。 有没有办法提供更有用的名称,例如? 如果是这样,则可以更轻松地在日志文件和其他地方(除了约束名称之外)不告诉您其他信息的地方查找问题。 问题答案: 从JPA 2.1开始,可以为外键命名。例如 只要确保在@JoinColumn中使用它

  • 本文向大家介绍请你来说一说协程?相关面试题,主要包含被问及请你来说一说协程?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 1、概念: 协程,又称微线程,纤程,英文名Coroutine。协程看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行。 例如: 由协程运行结果可能是12x3yz。在执行A的过程中,可以随时中断,去执行B,B也可能在