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

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

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

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

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

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

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

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

1 testdata = np.zeros((1, 80, 30))  ###   1  80  36
2 for i in range(80):  ##   80
3     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, 80, 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,  1,  2],
 9        [ 3,  4,  5],
10        [ 6,  7,  8],
11        [ 9, 10, 11]])
12 >>> a.reshape((4,3), order=‘F‘)
13 array([[ 0,  4,  8],
14        [ 1,  5,  9],
15        [ 2,  6, 10],
16        [ 3,  7, 11]])

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

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

1 tdata = np.zeros((47, 4))
2 ...
3 data = tctimeClient.recv(47 * 4 * 4)  # 40ms  4字节
4 ptr = 0
5 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。

原文地址:https://www.cnblogs.com/adjwang/p/11681646.html

时间: 2024-07-30 23:17:19

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

深夜Python - 第2夜 - 爬行

深夜Python - 第2夜 - 爬行 我曾经幻想自己是一只蜗牛,有自己的一只小壳,不怕风,不怕雨,浪荡江湖,游历四方……夜猫兄一如既往地打断了我不切实际的幻想:“浪荡?游历?等你退休了都爬不出家门口!”我知道夜猫兄要说什么,所以趁机话题一转:“Python不也是爬行动物么?”(注:Python=巨蟒) “呵,英语不错啊.” “你这是夸我么?”哇,得到夜猫兄的表扬,我开心到感觉头发多了3成. 夜猫兄正好闲着,给我来了段set.tuple.list运行速度对比的程序: 1 # !/usr/bin/

python模拟腾讯网页登录

近日,研究Tencent网页模拟登录的过程,过程有些忐忑.先将结果写于此,供大家参考: 其加密过程在c_login_old.js文件中执行,将JS关键代码提取出来如下: function hexchar2bin(str) { var arr = []; for (var i = 0; i < str.length; i = i + 2) { arr.push("\\x" + str.substr(i, 2)) } arr = arr.join(""); eva

【Python】入门 list有些不懂

#-*- coding: cp936 -*-  #首行加这个 代码里就可以加注释 raw_input("Press Enter Exit")  #最后一行加这个,可以直接点击脚本运行脚本 l[a:b] = [c] #即用右边的[c]完全替换a到b-1个元素 http://www.cnblogs.com/zhengyuxin/articles/1938300.html python list 操作 http://blog.csdn.net/sunvince/article/details

python数据结构与算法 34 归并排序

归并排序 在提高排序算法性能的方法中,有一类叫做分而治之.我们先研究其中第一种叫做归并排序.归并排序使用递归的方法,不停地把列表一分为二.如果列表是空或只有一个元素,那么就是排好序的(递归基点),如果列表有超过1个的元素,那么切分列表并对两个子列表递归使用归并排序.一旦这两个列表排序完成,称为"归并"的基本操作开始执行.归并是把两个有序列表合并成一个新的有序列表的过程.图10是我们熟悉的列表样例分解过程,图11是归并的过程. 图10  切分过程 图11  归并过程 以下是mergeSo

python笔记之列表和元组

pyhton的列表和元组,说白了其实就是一种数据结构,只是在python当中更加方便的去操作而已.. 1.序列 其实字符串就是采取序列的方式的: string = "hello" print string[0] 结果为:h 对比其他编程语言,python还有一个负值索引的概念: 序列的分片: first = [0,1,2,3,4,5,6,7,9] print first[1:6:2] 针对first[1:6:2]这条语句: 1代表的起始索引,不写,默认为0 6代表结束索引,不写默认为所

python学习之-文件和对象

文件和对象文件对象不仅可以用来访问普通的磁盘文件,还能够来访问普通的磁盘文件,也可以访问任何其他类型抽象层面的"文件".内建函数 open() 返回一个文件对象,对该文件进行后续相关的操作都要用到它.文件内建函数 open() 以及 file() 提供了初始化输入/输出(I/O)操作的通用接口.open() 内建函数成功打开文件后会返回一个文件对象,否则引发一个错误.当操作失败,会产生一个IOERROR异常.内建函数 open() 的基本语法:file_object = open(fi

python午后茶(一)

写在前面的话: 通过花费15分钟(上个大号绰绰有余吧)的时间,新手对python会有一个大概的印象吧. 这篇文章是模仿陈皓大牛的一篇文章的格局写的:http://coolshell.cn/articles/10739.html.或者自行搜索:lua site:coolshell.cn python位列3P(perl,php,python)之一.业界这样定义它:1)脚本语言:2)胶水语言: 阅读了<a  byte of python>之后,留下这篇文章做个备忘录, 这本99页的小册子描述的是老版

python的ConfigParser读取设置配置文件

python 读写配置文件在实际应用中具有十分强大的功能,在实际的操作中也有相当简捷的操作方案,以下的文章就是对python 读写配置文件的具体方案的介绍,望你浏览完下面的文章会有所收获. python 读写配置文件ConfigParser模块是python自带的读取配置文件的模块.通过他可以方便的读取配置文件. 这篇文章简单介绍一下python 读写配置文件的方法. 配置文件.顾名思议就是存放配置的文件.下面是个例子 点击(此处)折叠或打开 [info] age = 21 name = che

楞严经——14.10.10

楞严经原文 大佛顶如来密因修证了义 般剌密帝译 卷一 如是我闻.一时.佛在室罗筏城.祇桓精舍.与大比丘众.千二百五十人俱.皆是无漏大阿罗汉.佛子住持.善超诸有.能于国土.成就威仪.从佛转轮.妙堪 遗嘱.严净毗尼.弘范三界.应身无量.度脱众生.拔济未来.越诸尘累.其名曰.大智舍利弗.摩诃目犍连.摩诃拘絺罗.富楼那弥多罗尼子.须菩提.优波尼沙 陀等.而为上首.复有无量辟支无学.并其初心.同来佛所.嘱诸比丘.休夏自恣.十方菩萨.咨决心疑.钦奉慈严.将求密义.即时.如来敷座宴安.为诸会中. 宣示深奥.法