深夜Python - 第1夜 - for 迷 in 迷思

深夜Python - 第1夜 - for 迷 in 迷思,第1张

概述深夜Python - 第1夜 - for 迷 in 迷思   在一个月黑风高的夜晚,我悄悄打开编辑器,进入程序的世界。刚刚学会Python的我,由于一段时间的过度装B,被委托优化一段程序,我信心十足地接下来,看了又看……这不挺好的程序吗?但是又觉得哪不太对,无奈,只好去找夜猫兄。   “夜猫兄!速救!——”我敲门敲出了过年放烟花般的氛围。夜猫兄刚刚起床,瞅瞅我的程序,然后瞅瞅我,一脸鄙夷:“这……

深夜Python - 第1夜 - for 迷 in 迷思

  在一个月黑风高的夜晚,我悄悄打开编辑器,进入程序的世界。刚刚学会Python的我,由于一段时间的过度装B,被委托优化一段程序,我信心十足地接下来,看了又看……这不挺好的程序吗?但是又觉得哪不太对,无奈,只好去找夜猫兄。

  “夜猫兄!速救!——”我敲门敲出了过年放烟花般的氛围。夜猫兄刚刚起床,瞅瞅我的程序,然后瞅瞅我,一脸鄙夷:“这……是你写的?”

  “这是……其实是β兄的原创……”我感觉不妙……

  “真差!”夜猫兄只说了这2个字。

  “啥啥啥?”我满脸问号。上贡了十袋小鱼干,三杯热牛奶,终于让夜猫兄满意,同意传授我Python秘籍。夜猫兄亲自上手,带着我把代码优化了一遍。

 

  优化的位置很多,一段一段来看。

1 testdata = np.zeros((1,80,30))  ###   1  80  362 for i in range(80):  ##   803     for j in range(30):4         testdata[0,i,j] = m[i,j]

  这可以看成一段C语言里初始化数组的程序,其中np为numpy库,m为80×30的数组,testdata用于数据分类,必须增加一个维度,所以有了上面的程序,它类似于如下C语言代码:

1 int testdata[1][80][30] = {0};2 int i,j;3 for(i=0; i<80; i++){4     for(j=0; j<30; j++){5         testdata[0][i][j] = m[i][j];6     }7 }

  “夜猫兄,这不就是C语言的改写吗?有什么问题吗?”

  “Python的优势就是它语法很简洁,开发起来很高效,所以用Python模仿C开发就很搞笑。看我给你重写这段代码。”

  还没等我反应过来,夜猫兄的爪子就敲完了键盘……我一看,啥啥啥?这就行了?

1 testdata = m.reshape((1,30))

  “reshape是numpy自带的方法,可以重新组织数据,通俗点说,改变数组的形状。numpy底层是C语言实现的,所以速度比用Python的for快得多,而且代码简洁易读,这么写都不用加注释了。”

  “对对对,夜猫兄威武!”

  “多说一句,注意reshape函数是有别的参数可以用的,就是order。默认order=‘C‘,就是上面的效果,order=‘F‘就会按照列的顺序排列数据,还有个‘A‘,具体的去看官方文档。给你演示一下。”

 1 >>> a = np.arange(12) 2 >>> a.reshape((4,3)) 3 array([[ 0,1,2], 4        [ 3,4,5], 5        [ 6,7,8], 6        [ 9,10,11]]) 7 >>> a.reshape((4,3),order=C) 8 array([[ 0, 9        [ 3,10        [ 6,11        [ 9,11]])12 >>> a.reshape((4,order=F)13 array([[ 0,14        [ 1,5,9],15        [ 2,6,10],16        [ 3,11]])

  "哇,学到了学到了。"我笑嘻嘻地搓着手,“诶,那下面那段……”

  “对,类似的。”夜猫兄捻起一条小鱼干,嘬了一口牛奶,改起了下面的代码:

1 tdata = np.zeros((47,4))2 ...3 data = tctimeClIEnt.recv(47 * 4 * 4)  # 40ms  4字节4 ptr = 05 for i in range(47 * 4):6     tdata[ptr % 47][ptr // 47] = struct.unpack(f,data[4 * i:4 * i + 4])[0]  # / 浮点数除,//整除7     ptr += 1

  这段代码中data是接收到的字节数据,数据类型需要转换成float32,所以需要用struct修改数据类型,类似于C语言的强制类型转换。当然聪明如我——夜猫兄的高手在C语言里会用union(共用体)来实现类型的转换。会用C语言的童鞋可以看出,tdata[ptr % 47][ptr // 47]就是按照列的顺序排列数据。但是如夜猫兄所说,这样的做法在Python里非常低效的,应该用现成的库代替。而struct.unpack是可以多字节 *** 作的,所以应该用47×4个‘f‘一次性把数据全转换掉。

1 byte_data = tctimeClIEnt.recv(47 * 4 * 4)  # 40ms  4字节2 float_data = struct.unpack(f*47*4,byte_data)3 tdata = np.array(float_data).reshape((47,4),order=F)

  “夜猫兄,给讲讲struct呗~”

  “自己搜去!”夜猫兄只顾着改代码,不太愿意理我,我只好再掏出来一罐小鱼干……“这是官方文档,下次自己搜啊。”

  ……

  光阴似箭……牛奶杯渐渐见底……夜猫兄的爪子停了下来,“今天就到这吧,我要睡午觉了,代码慢慢改吧。”

  “哈?你是不是就是想要小鱼干和牛奶?”

  “闭嘴,你走!”夜猫兄一口干了剩下的小鱼干,把罐子扔给我,“垃圾什么的都带走啊!”

 

   深夜Python,第1夜,2019.10.16。

总结

以上是内存溢出为你收集整理的深夜Python - 第1夜 - for 迷 in 迷思全部内容,希望文章能够帮你解决深夜Python - 第1夜 - for 迷 in 迷思所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1190570.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存