python 的性能之低简直不能忍啊

2015-11-02 10:43:54 +08:00
 eightqueen
参照 rabbitmq 官网 workqueue 模式分别用 java 和 python 实现了两个客户端,推 1000 条消息, java 花费 50ms , python 花费 3s , 60 倍啊。
17467 次点击
所在节点    问与答
68 条回复
mengzhuo
2015-11-02 15:37:56 +08:00
明显是 IO 型的程序,和语言几乎没啥关系, LZ 刚入行吧
上 gevent 或者 py3 的 async ,我们看看哪个厉害
mulog
2015-11-02 15:56:57 +08:00
没错 python 虽然是慢也不能什么锅都接啊。。
别的不说我复制楼主你的代码也跑不出 3s 这种水平啊

➜ test_pyjava sudo rabbitmqctl list_queues
Listing queues ...
celery 0
task_queue 3000
...done.
➜ test_pyjava py py.py
0.0359241962433
➜ test_pyjava sudo rabbitmqctl list_queues
Listing queues ...
celery 0
task_queue 4000
...done.
➜ test_pyjava py py.py
0.0347700119019
➜ test_pyjava sudo rabbitmqctl list_queues
Listing queues ...
celery 0
task_queue 5000
...done.
clino
2015-11-02 16:07:42 +08:00
我觉得完全可以优化到差距不大的水平
for i in range(1000)
这个改成 xrange 先
marchon
2015-11-02 16:09:55 +08:00
41 楼说的才靠谱啊, io 型的任务肯定得用 gevent 之类
eightqueen
2015-11-02 16:11:55 +08:00
@clino 改成 xrange 没用
@mulog @mengzhuo 你们都同时用 java 和 python 测过吗?
clino
2015-11-02 16:16:01 +08:00
@eightqueen
properties=pika.BasicProperties(
delivery_mode = 2, # make message persistent
)
这个参数每次都是一样的吧?
你在 for 外面生成一个对象,然后每次直接传这个参数进去看看
geew
2015-11-02 16:25:34 +08:00
这种月经帖也是够了啊 先不说代码优化方面的问题 你说一个脚本语言和编译型语言有可比性吗....
eightqueen
2015-11-02 16:27:41 +08:00
@clino 结果一样
clino
2015-11-02 16:33:56 +08:00
@eightqueen 那我觉得效率低的部分应该在你调用的 rabbitmq 的 python 库里,先不要那么怪 python 语言本身
lightening
2015-11-02 16:42:10 +08:00
你是 localhost 上 host 的 RabbitMQ 吗?
我们用的 Ruby ,应该是比 Python 还慢的。但是我们一秒钟能 push 7000 条信息,还带 ack 的。
mulog
2015-11-02 17:01:59 +08:00
@eightqueen 测给你看咯

➜ test_pyjava py py.py
0.0353381633759
➜ test_pyjava java -cp 'rabbitmq-java-client-bin-3.5.6/*:.' Producer
56
➜ test_pyjava py py.py
0.0339579582214
➜ test_pyjava java -cp 'rabbitmq-java-client-bin-3.5.6/*:.' Producer
56
➜ test_pyjava py py.py
0.0334329605103
➜ test_pyjava java -cp 'rabbitmq-java-client-bin-3.5.6/*:.' Producer
55

都是你的代码 一行没改 rabbitmq 在本地跑

python 2.7.6
java version "1.7.0_76"
eightqueen
2015-11-02 17:14:50 +08:00
@mulog 见鬼了,为什么你这里 python 比 java 还快?改了什么代码吧。
harry890829
2015-11-02 17:17:06 +08:00
@sujin190 java 都啰嗦啊……那我这种写 c/c++的怎么办……
sujin190
2015-11-02 18:31:06 +08:00
@harry890829 java 的啰嗦不在于语言语法,而在于各种设计模式什么的滥用,用个 java ,光配置文件就看得头大。。 c/c++也可以写的很简练啊
harry890829
2015-11-02 18:55:49 +08:00
@sujin190 恩 c/c++确实可以写的很简练,主要是什么都要自己写,毕竟也是挺麻烦的
clino
2015-11-02 21:15:07 +08:00
https://docs.python.org/2/library/profile.html 在你的两个环境下都分析一下看看
imdoge
2015-11-02 22:14:33 +08:00
为什么在 leetcode 里,看运行时间 JAVA 运行时间才是最慢的?
ethego
2015-11-02 22:16:04 +08:00
```
zeno@go:~$ pypy test2.py
0.135266065598
zeno@go:~$ pypy test2.py
0.0797960758209
zeno@go:~$ pypy test2.py
0.0784769058228
zeno@go:~$ pypy test2.py
0.0792558193207
zeno@go:~$ pypy test2.py
0.131166934967
zeno@go:~$ pypy test2.py
0.0794620513916
zeno@go:~$ pypy test2.py
0.078901052475
zeno@go:~$ source venv/bin/activate
(venv)zeno@go:~$ python test2.py
0.0328559875488
(venv)zeno@go:~$ python test2.py
0.0401589870453
(venv)zeno@go:~$ python test2.py
0.0292019844055
(venv)zeno@go:~$ python test2.py
0.0398349761963
(venv)zeno@go:~$
```
imdoge
2015-11-02 22:16:05 +08:00
@geew java 算是编译之后的解释型语言
Zzzzzzzzz
2015-11-02 22:26:17 +08:00
Jython 性能比 CPython 还烂。

range 和 xrange 在 1000 这个级别体现不出性能差, 相反小数组比起迭代来说不定 range 还会快点。

建议楼主 python 用多进程或者 gevent 的属于作弊, 毕竟顶楼那段 java 也没用 NIO 或者多线程。

单纯 IO 操作 PyPy 和 CPython 性能没太大差别, 有些时候 PyPy 还更慢点, CPython 和 Java 在运算上可能差很大, 但是 IO 操作上差距不会太大, 顶楼这个测试以 IO 为主, 差距这么大太不正常了, 建议跑一下 profile 在其他方面找找原因。

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

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

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

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

© 2021 V2EX