免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 9645 | 回复: 25
打印 上一主题 下一主题

PYthon的循环,简直是垃圾啊。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-04-19 16:14 |只看该作者 |倒序浏览
有一段代码是这样子的:
while 1:
         go()  # 在循环的时候,统计python脚本每秒能执行多少次。
         time.sleep(0.000005)  #sleep

进过计算,平均每秒才1000次。绝对不会超过1000.
如果把sleep的时间写成time.sleep(0.000001),还是每秒1000次。
奇怪了。难道sleep无效?如果把sleep去掉,确实快,每秒10W以上吧,但是cPU占用100%。(我在循环里进行网络信息收发,100%占用是不可接受的。)
难道python的循环里面无法控制?

论坛徽章:
0
2 [报告]
发表于 2012-04-19 16:29 |只看该作者
因为sleep精度问题,可以自己google一下,据说好像是精确到15ms还是多少了

论坛徽章:
0
3 [报告]
发表于 2012-04-19 16:30 |只看该作者
后来我把time.sleep改为c版本的usleep,通过python的扩展调用,结果还是一样每秒1000次。奇怪了

论坛徽章:
0
4 [报告]
发表于 2012-04-19 16:47 |只看该作者
回复 1# huangyacong


  大概所有的分时系统都到不了你要的精度~~~不管你用什么语言

论坛徽章:
0
5 [报告]
发表于 2012-04-19 16:50 |只看该作者
回复 4# foxwb

至少在c语言下,使用sleep的时候,是有效的吧。为何python就例外哇
   

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
6 [报告]
发表于 2012-04-19 16:56 |只看该作者
这是操作系统实现策略,和python或c没一毛钱关系
Linux能支持的精度就在1毫秒左右

论坛徽章:
0
7 [报告]
发表于 2012-04-19 17:02 |只看该作者
回复 6# timespace


    如果使用c调用usleep(1)一微妙,确实能实现哇

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
8 [报告]
发表于 2012-04-19 17:46 |只看该作者
回复 7# huangyacong
详细说下你的测试方法。

下面是我的实验结果(ubuntu 11.10,cpu i7 3.4GHz, mem 4G):
循环10000次,每次1微妙
执行了五次,可以看到时间介于1~10秒,精度略高于1毫秒,但完全达不到1微妙
随着硬件发展和软件更新,这个精度会逼近,但现在还差很远
  1. #include <stdio.h>
  2. #include <unistd.h>

  3. int main(int argc, char* argv[])
  4. {
  5.         unsigned int cnt = 0;
  6.         while (1)
  7.         {
  8.                 usleep(1);
  9.                 if (++cnt > 10000) break;
  10.         }

  11.         return 0;
  12. }
复制代码
cpp $gcc -g -O2 -Wall usleep.c
cpp $time ./a.out

real        0m4.249s
user        0m0.000s
sys        0m1.176s
cpp $time ./a.out

real        0m2.238s
user        0m0.000s
sys        0m0.664s
cpp $time ./a.out

real        0m1.975s
user        0m0.000s
sys        0m0.604s
cpp $time ./a.out

real        0m7.745s
user        0m0.000s
sys        0m2.296s
cpp $time ./a.out

real        0m3.088s
user        0m0.000s
sys        0m0.876s





   

论坛徽章:
0
9 [报告]
发表于 2012-04-19 17:56 |只看该作者
回复 8# timespace


    哥哥,请不要用c、c++,
如果用c来写,请这么写(伪代码)
int main()
{
     total_count = 0  一共执行的次数
    cur_count = 0  当前执行的次数
    cur_time = time 当前时间
     while 1:
         total_count += 1
       if now_time > cur_time + 300
           tmp_count = total_count  -  cur_count
           tmp_time = now_time -  cur_time
           print  float(tmp_count) *  float(1000) /   float(tmp_time)
          cur_count = total_count
           cur_time = now_time
        usleep(1)
}

print出来的就是每秒循环的TPS。使用c来写,绝对不是1000次每秒。如果把上面的伪代码改为python,最高不过1000次每秒

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
10 [报告]
发表于 2012-04-19 18:09 |只看该作者
回复 9# huangyacong
代码?
结果?
给个有说服力的实例


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP