Python集成算法服务

15 篇文章 1 订阅

0.背景

传统化学法做水质参数检测时虽然精度较高,但是耗时长、耗费大量化学药剂人力等资源,很难满足现有定型化快速化检测的需求。所以提出全光谱检测算法,其基本原理是在传统化学法得到结果的前提下,使用对应的全光谱谱图,二者结合生成训练集,再使用数学上的一些建模方法,建立全光谱分析模型。在得到一条新的全光谱谱图时,可以根据该模型计算预测出相应的因子值。
原有公司近红外建模也是类似原理,不过建模,预测等功能都是在.Net平台上。需要程序员编写大量的基础算法,耗费大量人力,最终得到的结果往往也是不尽人意。考虑到Python在数学建模,大数据等方面有各种优秀的开源库,算法搭建、验证都很方便,现尝试在Python平台上实现主要的预测建模算法。

1.调用脚本

开始是在.Net平台调用Py脚本,通过Python的Ptint()方法打印结果并且在.Net端获取。该方法调用简单,但是传递数据有限、效率低,预测一个数据大概花费600-800ms,在数据批量预测时不占优主要通过在调用py脚本时传入预先保存的谱点图,算法模块读取该文件后打印预测结果,C#端通过ReadToEnd()方法获取该值,这样完成程序的一次交互。
在这里插入图片描述

2.Tcp通讯

调用脚本虽然简单,但是只能在同一台机器上预测,使用文件交互会导致大量冗余垃圾文件等,在灵活性和效率方面有所欠缺。这里尝试将算法预测抽象为服务,接受来自客户端的预测请求,最后将结果传输回客户端。这里考虑使用网上开源的simpletcp开源库建立tcpserver,接受来自客户端的请求。
另外,在算法使用pyqt框架实现了图形化展示,将预测的过程和异常等通过界面展示。后台通过QThread建立一条监听线程,在有新的预测请求来临时,进行预测,同时将后台信息通过信号/槽的技术推送到前台显示。这里请注意,qt的信号emit()是异步的,所以要将UI和业务分离,切忌在emit()订阅的方法中做业务相关工作,否则会导致预测出错。
考虑对同一条光谱可能会有不同的预测算法,这里使用策略模式将算法和业务分离。在添加新的算法时增加 self.compositors实现成员即可,该成员须实现get_predcit_result()方法。另外Python是一种动态语言,没有接口和虚方法这一说法的,所有很多东西都需要成程序员自己做规定,对代码的规范性要求更高。在做好规范性的前提下,开发效率应该不低于C#。

class Predict(object):
    # 使用策略模式实现算法的灵活增加
    def __init__(self, data):
        self.data = data
        self.compositors = [WaterTypeCompositor(), FactorCompositor()]

    def predict_values(self):
        data_pred =self.data
        # 导入预测配置文件
        pred_para = load_utils.load_params('./PyPredict/PredictItemConfig.json')
        x, y = data_pred[0], data_pred[1]
        result = {}
        for c in self.compositors:
            result.update(c.get_predcit_result(pred_para, x, y))
        return _formatDic(result)

3.感悟心得

由C#转来做Python,虽然上手还算是快的,但是真的想写好Python代码,还是要深入学习这门语言的。下面来总结一下C#和Python的不同之处吧。
C#是静态语言,Python是动态语言。C#的很多类型在声明时就要定义好,在传参,方法调用,赋值等操作都需要按照其规范来。Python的变量在运行时动态赋予,一个对象可能是数值,字符串,链表等,也没有所谓的编译,编写时没有大量的声明,很多错误只能在运行时发现,这就要求Python程序需要有足够的测试来支撑。
命名方面,Python和C#在命名方面有很大不同,一个是段横杠,一个时驼峰式命名。这里我也纠结了很久,到底遵循哪个命名方案,后来还是决定入乡随俗,写Python代码时还是遵循Python的命名风格,看起来更加和谐。
面向对象方面,二者都是面向对象的语言。但是Python是一门动态语言,没有C#中的抽象方法,虚方法,接口等概念了,方法调用也少了很多智能提示。模块导入也是以文件为单位的,文件的命名就显得很重要了。一下子少了这么多语法限制,还是很难适应过来的。
效率方面,网上可能都说Python的运行效率太低了。我觉得Python可以满足我们工作中绝大部分的性能要求,很多所谓的新能问题,最后可能都是代码的编写问题,由于不整洁的代码导致整个软件运行卡顿,自己找不到优化点,最后归结于语言。
最后,有一说一,Python写起来没C#爽这是真的!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值