我工作的内容大致分为三种:MCU、DSP嵌入式开发,工控软件开发,控制和信号处理的算法研究。
嵌入式开发
开发嵌入式程序主要是C语言和少量汇编,但是Python也派上了大用处,例如可以用它先模拟算法,设计滤波器,绘图。也可以设计一些调试工具,例如通过串口、CAN通信实时观察芯片内存中的数据,有时候调试比较复杂的东西时,甚至可以用pywinauto自动化界面操作,按照一定逻辑排查错误。在这些工作中,Python起到辅助作用。
工控软件开发
工控软件开发主要是通过一些AD,DA,DIO,电机驱动扩展卡,监控传感器,控制电机,读取并分析数据。这些程序原先是采用VC 6.0编写的,界面设计一直很成问题,一个好的绘图控件都没有。后来我改用C#,提高了一些开发效率,但是C#语法比较麻烦,一段时间不接触就忘记了。后来就改用Python,问题是那些扩展卡都没有Python的演示程序,因此需要自己动手用ctypes库调用扩展卡的DLL驱动程序。一旦和扩展卡打交道的程序写好之后,剩下的就是Python的强项了。
- 用PyQt, wx可以很方便地制作界面,界面要求不高时,也可以用TraitsUI。
- 绘图工具可以用Chaco, Mayavi, matplotlib,如果要求绘图速度比较高的话,可以用guiqwt,这个是对Qt的qwt绘图库的包装,速度要比其它的都快。
- 如果需要做图像处理,那么OpenCV就派上用场了。
- 如果需要高效计算的话,一般可以用NumPy解决,解决不了的就用Cython或者SWIG写一个扩展。有时还需要用多进程模块multiprocessing。
- 数据存储可以用sqlite,如果是大规模的数据,可以用pyTable保存成HDF5格式。
使用Python能够解决绝大部分的工控软件的需求。
算法研究
Python开发快,比较适合研究算法,虽然执行的时候会很慢,不过也可以通过NumPy, Cython或者寻找一些现成的扩展库改善。当算法比较成型时,再用C, C++改写。
曾经有一个模拟项目的动态性比较高,用Python比较容易实现,运行速度虽然尚能接受,但是有时需要进行上百次模拟运行时,就需要等待很长时间了,因此决定用C++重写。而我的C++水平有限,不知道该如何设计,我最后采用Python动态输出C++代码,调用C++编译器编译成DLL,然后通过ctypes动态载入。由于每次根据用户的设置都会生成C++代码,因此使用的C++功能很基础,没有继承,虚函数等东西,我想能最大地提高程序的运行速度。最终程序的运行速度比Python版本提高了10-20倍(Python版本已经足够优化,使用了NumPy, SciPy的一些高速运算函数,否则纯粹的循环、判断和数值运算的话,C要比Python快几百倍)。
Python的优势
- 扩展库非常丰富,而且都能看到源代码,源代码有时候比文档更管用。
- 便携性,我在U盘中安装了一个portablepython,并将所有会用上的扩展库都放进去了,这样无论到哪台机器上,都能运行我的Python程序。
- Python语法优美,用Python写程序是一种享受。
关于本书的编写
这本书的编写历时近3年,是我在工作中自学的一个总结,因此成书时间拖得比较久。如果真要写的话,书中介绍的每个扩展库都可以写出一本书来,因此这本书只能起到入门、打基础的作用。读者可了解到足够多的库,但是具体到实际工作中的某个问题时,还需要您自行查找文档,甚至分析库的源程序。在解决问题的同时所学习到的才是最有用、最牢固的。
也许您会怀疑花许多时间学习一门新的语言,以及那么多不太出名、甚至文档都不全的扩展库是否值得。那么你可以看看我的经验:我在工作中一边自学一边用来做实际的项目,这几年下来我感觉我的开发效率比用C#时高出3-4倍,比用VC时高出7-8倍。而我获得的回报就是,每天都能不用加班,并且写出了这本书,更重要的是,我还有更多的时间陪伴家人了。
欢迎到本书的论坛共同探讨Python科学计算方面的问题。
阅读(918) | 评论(0) | 转发(0) |