Python for 循环的效率是这么差么?还是别的什么原因?

2022-08-01 15:30:50 +08:00
 wyc9296

三种写法,耗时从高到低,如下面代码所示,输出结果一样。各位大佬帮忙看下原因?

a = ''
for i in range(100000):
    a = a+str(i)+'->'
b = ''.join([str(i)+'->' for i in range(100000)])
c = '->'.join(map(str, range(100000)))+'->'

输出结果:0->1->2->3->4->5->6->7->8->9...->99998->99999->

5147 次点击
所在节点    Python
39 条回复
houzhiqiang
2022-08-01 17:17:53 +08:00
#8 @churchill 的代码
node v16.14.2
time node test.js
python sucks: 26.584ms
node test.js 0.10s user 0.02s system 98% cpu 0.124 total

#9 @lingly02 的代码 把他的 Array(10000)换成 Array(100000)
node v16.14.2
time node test.js
python sucks: 24.985ms
node test.js 0.06s user 0.02s system 97% cpu 0.084 total

@houzhiqiang
houzhiqiang
2022-08-01 17:19:43 +08:00
@wxf666 cpython3.10 比 #8 @churchill 稍快一点
wxf666
2022-08-01 17:30:43 +08:00
@houzhiqiang 嗯?我第一眼看你 17 楼,以为 v8 比 pypy 快一倍,比 cpython 快五倍呢,

原来你是用了 少一个数量级 那个代码啊。。
wxf666
2022-08-01 17:43:12 +08:00
@HankLu 其他帖子有大佬说过,Python 的 in 用了介于 Boyer-Moore 和 Horspool 之间的算法,比 KMP 快

还不满足的话,你可以问问 @xgdgsc #16 ,

按他说法,那个啥语言随便起来比 Python 快几个数量级(假设 3 个),那严肃起来还要再快 1~2 个

有个排行榜说,C/C++ 比 Python 快 2 个数量级,

综合算下来,那个啥语言严肃地写,可以比 C/C++ 快 1~3 个数量级
churchill
2022-08-01 18:00:35 +08:00
这。。。我就是打个趣,代码是按楼主的第一种写法原封不动搬来的
性能这个事情 python 也还是要挣扎一下吗,大可不必
黑魔法的话 js 也有呀
warm 一下立杆见影
test()
setTimeout(() => {
console.time("python sucks")
test()
console.timeEnd("python sucks")
})
lingly02
2022-08-01 18:25:52 +08:00
@houzhiqiang 上班摸鱼,看错数量了,😅
wxf666
2022-08-01 18:27:26 +08:00
@churchill 感觉就像娱乐圈明星某些粉丝的行为,别人讨论点不相干的啥都来踩一脚。。

“我家 xxx 最棒!”

我不是哪个语言的粉,有更合适的就学着用
Elaina
2022-08-01 18:30:50 +08:00
是字符串拼接影响效率,你把字符串拼接改成空操作,就没这么夸张了
churchill
2022-08-01 19:20:42 +08:00
@wxf666 伤害到你的感情了,我很抱歉,对不起,python 好棒棒 😄
zhuweiyou
2022-08-01 19:34:24 +08:00
字符串拼接的问题
xgdgsc
2022-08-01 20:02:56 +08:00
@wxf666 for 循环里先读取 memmap 的 array 里一个数,然后调用函数,这种情况反正用 julia 比 python 至少快一个数量级,我用几只不过想不起来具体快多少了,并不是说一定大于等于 3 才用几.
HankLu
2022-08-01 20:20:58 +08:00
@wxf666 其实很满意 Python 的 in 操作,就是想找更快的
w3cll
2022-08-01 20:41:50 +08:00
蹲一个 PHP 的
pytth
2022-08-01 21:06:26 +08:00
```
<?php

$starttime = explode(' ',microtime());
for($i=0; $i<100000; $i++){
echo $i.'<br/>';
}
$endtime = explode(' ',microtime());
$thistime = $endtime[0]+$endtime[1]-($starttime[0]+$starttime[1]);
$thistime = round($thistime,3);
echo '用时'.$thistime;

?>
```

<img src="https://sc01.alicdn.com/kf/Ha0b06a519774459597cb42b339bd7ecbx.png" />


@w3cll
wxf666
2022-08-02 00:23:23 +08:00
@churchill 嗯,我痛心疾首

那 21 楼会让你如丧考妣
wxf666
2022-08-02 00:34:25 +08:00
@HankLu 你可以去问问 @churchill ,毕竟 js 是世界上最好的语言,写出来的代码有着 O(1/N) 复杂度,区区一个大文件算得了什么,某些机构对世界的监控就是用 js 做搜索的
Aloento
2022-08-02 02:35:47 +08:00
@wxf666 你在说什么(((
jinliming2
2022-08-02 08:38:11 +08:00
@pytth #34 你这个 echo 是流输出啊,不是字符串拼接,有点作弊了哦……
Anivial
2022-08-02 10:01:55 +08:00
一个提问贴能多这么多阴阳怪气的人也是没谁了,以后看见歪楼的就走,无语死

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/869981

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX