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

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

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

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

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

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

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

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

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

 int testdata[][][] = {};
int i,j;
for(i=; i<; i++){
for(j=; j<; j++){
testdata[][i][j] = m[i][j];
}
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  ……

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

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

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

  深夜Python,第1夜,2019.10.16。

深夜Python - 第1夜 - for 迷 in 迷思的更多相关文章

  1. 深夜Python - 第2夜 - 爬行

    深夜Python - 第2夜 - 爬行 我曾经幻想自己是一只蜗牛,有自己的一只小壳,不怕风,不怕雨,浪荡江湖,游历四方……夜猫兄一如既往地打断了我不切实际的幻想:“浪荡?游历?等你退休了都爬不出家门口 ...

  2. 【颓废篇】人生苦短, 我用python(二)

    当时产生学习python的欲望便是在看dalao们写脚本的时候… 虽然dalao们好像用的是js来着.. 不过现在好像很多爬虫也可以用python写啊… 所以学python没什么不妥. 而且csdn整 ...

  3. Python调用matplotlib实现交互式数据可视化图表案例

    交互式的数据可视化图表是 New IT 新技术的一个应用方向,在过去,用户要在网页上查看数据,基本的实现方式就是在页面上显示一个表格出来,的而且确,用表格的方式来展示数据,显示的数据量会比较大,但是, ...

  4. 【python】配置文件

    来源:http://developer.51cto.com/art/201003/189885.htm python 读写配置文件在实际应用中具有十分强大的功能,在实际的操作中也有相当简捷的操作方案, ...

  5. python的ConfigParser读取设置配置文件

    python 读写配置文件在实际应用中具有十分强大的功能,在实际的操作中也有相当简捷的操作方案,以下的文章就是对python 读写配置文件的具体方案的介绍,望你浏览完下面的文章会有所收获. pytho ...

  6. linux手动安装python

    前提:你的linux服务器必须有gcc编译器,gcc查看方法:linux命令行>gcc -v 如果返回版本信息证明已经安装, 如果找不到命令,跳到这篇手动安装gcc >>> l ...

  7. 【日语】日语单词N3_N4_N5

    日语单词N3_N4_N5 单 词 讲 解 あ行单词 ああ:0[副]那样.那种 例句:ああ言うことはしないほうがいい.那样的事情最好不做. 電車の窓からごみを棄てているああ言うことはしないほうがいい. ...

  8. 日语单词N3_N4_N5

    单 词 讲 解 あ行单词 ああ:0[副]那样.那种 例句:ああ言うことはしないほうがいい.那样的事情最好不做. 電車の窓からごみを棄てているああ言うことはしないほうがいい. 挨拶(あいさつ):① 寒暄 ...

  9. java的stream让我灵光一现

    说实话,我是一个到了退役也没有搞明白C++的istream和ostream的. 刚开始的时候我把<iostream>直接拆解成ios和tream 真,果粉暴露 退役之后划水,倒是从java ...

随机推荐

  1. Golang 标准库提供的Log(一)

      原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://gotaly.blog.51cto.com/8861157/1405754 G ...

  2. vc/atlmfc/include/afx.h(24) : fatal error C1189: #error : Building MFC application with /MD[d] (CRT

    环境:win7,64位,vs2012 1> c:/program files/microsoft visual studio 8/vc/atlmfc/include/afx.h(24) : fa ...

  3. Entity Framework 应用程序有以下优缺点

    优点: 1.跨数据库支持能力强大,只需修改配置就可以轻松实现数据库切换2.提升了开发效率,不需要在编写Sql脚本,但是有些特殊Sql脚本EF无法实现,需要我们自己编写(通过EF中的ExecuteSql ...

  4. delete 和 splice 删除数组中元素的区别

    delete 和 splice 删除数组中元素的区别 ` var arr1 = ["a","b","c","d"]; d ...

  5. install busybox时报error: storage size of ‘rlimit_fsize’ isn’t known struct rlimit rlimit_fsize

    解决办法: 在busybox根目录下查找到文件:find -name libbb.h 在libbb.h.h中包含sys/resource.h 说明: 上述错误的原因是rlimit结构体未知,原因是相应 ...

  6. python3 使用int函数将浮点数转换成整数

    int函数将浮点数转换成整数需要注意的地方 >>> int(153)153>>> int(153.4)153>>> int(153.5)153&g ...

  7. css过滤镜实现颜色渐变

    语法:filter : progid:DXImageTransform.Microsoft.Gradient ( enabled=bEnabled , startColorStr=iWidth , e ...

  8. 笔记-ubuntu中/home下中文目录改英文

    安装ubuntu后,如果选择的语言是中文,那/home下的文件夹会默认中文,在使用命令行的时候很不方便,此文记录切换成英文的方式,以便日后查看. 将目录重命名为英文 可以使用图形化界面,直接重命名 可 ...

  9. redis主从复制和哨兵

    摘自:https://www.cnblogs.com/leeSmall/p/8398401.html 一.Redis主从复制 主从复制:主节点负责写数据,从节点负责读数据,主节点定期把数据同步到从节点 ...

  10. jq-在线引入

    <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script><sc ...