`
lin_llx
  • 浏览: 127271 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

优化Python代码有感

阅读更多

最近信息安全的老师布置了作业。要求实现DES算法。。写了1天,优化了1天。。。小有些心得。。

首先感慨一下DES算法。。真是对人对机器都不友好的算法。。竟然还有诡异的S-BOX操作。。。

第二感慨一下Python对2进制不那么方便的支持。。连bin函数都没有。。虽然3.0有了。。可惜2.5没有。。只能自己实现,一大损失效率的地方啊。


好,接下来说说优化过程。

      首先是单线程改多线程。。原来是将明文分成64bit一块的序列,每块单独加密。改成每一个64bit的块开一个线程操作。

      单线程加密解密一个1000长度的字符串所需时间大致和多线程加密10000长度的相等。效率提升明显。


      其次是优化异或过程。原来的异或是整体将字符串转成整数然后再异或,发现效率很低。第一次修改为将2个字符串的每一位单独取出转成整形以后异或,效率提升不明显。后来上课时候突然想到,异或操作其实完全可以抛弃整数。1位的2个字符串的异或操作只有4种,写一个字典,用想要异或的2个字符串作为key,结果作为value。简单实现了一下。

def Xor(s1, s2):
    """
    字符串xor
    
    s1 -- 第一个字符串
    s2 -- 第二个字符串
    """
    data={}
    data['0','1']=data['1','0']='1'
    data['0','0']=data['1','1']='0'
    s=[data[s1[x],s2[x]] for x in range(0,s1.__len__())]
    return ''.join(s)
 

      第三就是优化10进制转2进制。因为python没有提供 bin 函数。于是自己实现了一个。


dec2bin = lambda n:''.join([hex2bin(x) for x in hex(n)[2:].rstrip('L')]

 

但是在用profile做测试的时候发现的。程序运行中大量的用到了这个函数。很占cpu时间。经过观察发现主要是2个地方使用很多,第一就是异或操作的时候,因为python提供的异或只能在整数之间进行,第二就是在S_BOX运算的时候。

      异或操作已经优化了。不需要10进制转2进制了。。剩下就是S_BOX运算了。经过观察发现,S_BOX里面最大的数也不过 15,于是想到可以穷举所有S_BOX里面的数字的值对应的二进制。更改代码如下。

def easyDec2Bin(s):
    """
    简单的10进制转2进制,用于简化s_box操作
    
    s -- 10进制数
    """
    data={0:'0000',1:'0001',2:'0010',3:'0011',4:'0100',
		      5:'0101',6:'0110',7:'0111',8:'1000',9:'1001',
		      10:'1010',11:'1011',12:'1100',13:'1101',14:'1110',
		      15:'1111'}
    return data[s]
 

  第四步优化也是通过profile发现的。。发现程序运行过程中,大量的时间消耗在一个lambda函数上。

    b= ''.join(map(lambda x:data[x],s))

   这个函数的作用是生成一个字符串。。尝试着把这个lambda函数改成列表操作。

    b= ''.join([data[x] for x in s]

      效率提升明显。。。原来一直以为map操作比较快。看来并非如此。难怪Guido大叔要推广列表操作了。。


      最后一步优化就是用了psyco模块,将程序变成JIT的。。效率提升很大。。。


最终优化的结果就是,加密解密1个40k的文件,原本需要将近50秒的时间,现在10秒不到就完成了。。。。


效果提升明显。不过总觉得还有提升的空间。。尝试把多线程改成Stackless版本的试试看。。。。希望能有更大的提高 。。。。

1
0
分享到:
评论

相关推荐

    医学图像分割经典深度学习网络Python代码实现.zip

    代码可能会包括网络结构的定义、损失函数的选择(如交叉熵)、优化器的设定(如Adam)以及训练和验证流程。此外,数据预处理、数据集划分、模型保存和评估也是实现过程中必不可少的步骤。 在实际应用中,这些模型...

    大数据技术协同优化Python课程教学模式研究.zip

    "大数据技术协同优化Python课程教学模式研究"这一主题旨在探讨如何利用大数据的优势改进Python编程课程的教学方法,提高教学质量与学生的学习效率。Python作为一门强大的编程语言,其易读性、广泛的应用场景以及丰富...

    用python代码放烟花.zip

    本篇文章将深入探讨如何使用Python代码来实现这个有趣且富有创意的效果。 首先,我们要介绍的是`matplotlib`库,它是一个用于创建静态、动态、交互式可视化的强大库。虽然`matplotlib`最初设计用于绘制2D图表,但...

    Python-CVPR2018微表情识别论文实现代码

    这篇"Python-CVPR2018微表情识别论文实现代码"涉及到了深度学习在微表情检测与识别中的应用,这在心理学、人机交互和行为分析等领域具有广泛的应用价值。 首先,让我们深入理解微表情识别的挑战。由于微表情的短暂...

    欢乐斗地主python项目游戏源码下载

    通过Python编程语言,我们可以实现斗地主游戏的自动化运行,并且借助强大的AI算法优化出牌策略,从而提高游戏的趣味性和挑战性。 在这个项目中,游戏的核心逻辑是至关重要的。这包括牌局的初始化、发牌、出牌、牌型...

    深度学习与python程序.zip

    "深度学习与Python程序.zip"这个压缩包包含了利用Python进行深度学习实践的代码示例,特别适合已经熟悉Python基础的初学者进一步探索深度学习。 在这个压缩包中,我们可以看到多个Python脚本,它们分别对应不同的...

    基于Welsh算法的灰度图像彩色化处理及优化python实现源码+项目说明+详细注释.zip

    基于Welsh算法的灰度图像彩色化处理及优化python实现源码+项目说明+详细注释.zip 该资源内项目代码都是经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 本项目适合计算机相关专业(如计科、人工智能、...

    深度学习,transformer网络,图像分类识别python代码

    本项目提供的Python代码实现了基于Transformer的图像分类识别系统。这通常包括以下几个步骤: 1. 数据预处理:首先,我们需要对图像数据进行预处理,包括缩放、归一化等操作,使其适应Transformer模型的输入要求。 ...

    python3.3绿化版

    在性能优化上,Python3.3对解释器进行了改进,比如引入了更快的字节码编译器,提高了代码的执行速度。同时,文件对象现在默认以文本模式打开,对于跨平台开发更加友好。 在标准库方面,Python3.3增加了许多新模块,...

    利用torch.nn实现二维卷积python代码

    训练模型时,我们需要定义损失函数(如`nn.CrossEntropyLoss`)和优化器(如`optim.SGD`),然后在训练集上迭代进行前向传播、计算损失、反向传播和更新权重。 ```python model = SimpleCNN() criterion = nn.Cross...

    《程序员数学 》用python学透线性代数和微积分,源码程序,和书本对应 并做了错误的修改bug

    在Python编程环境下,你可以通过编写和运行代码来直观地感受这些概念。例如,向量的加法、减法和标量乘法可以通过Python的列表操作实现,矩阵乘法则可以通过numpy库轻松完成。行列式的计算和矩阵的逆可以通过特定的...

    Python模拟太阳-地球-月亮运动模型_python模型运动_python教程_

    在Python编程领域,模拟物理现象是一种有趣的实践,可以帮助我们更好地理解和可视化复杂的自然规律。本教程将专注于构建一个太阳...在实际操作中,不断优化代码性能,提高模拟的精度,将使这个项目更具挑战性和趣味性。

    python官方2.7.16rc1版本msi安装包

    在安装Python后,用户可以通过命令行交互式模式(Python shell)或使用IDE(如PyCharm、Visual Studio Code等)来编写和执行Python代码。Python的社区活跃,拥有大量的第三方库,如NumPy、Pandas、Django等,可以极...

    用Python写出黑客帝国里的代码雨

    本教程将教你如何使用Python来实现这样的效果,让你的屏幕也能像电影中一样下起“代码雨”。让我们一起深入这个编程之旅,感受黑客帝国的神秘魅力。 首先,我们需要了解的是Python的基本语法和控制流。Python是一门...

    Python-2018编程日历壁纸

    通过这款壁纸,Python开发者和学习者可以在日常生活中不断接触和复习编程知识,同时感受到编程社区的活力。如果你对Python有着浓厚的兴趣,这款日历壁纸无疑是提升编程热情、增强学习氛围的优秀选择。

    DIBR程序代码,基于左右图

    该技术利用左右眼的2D图像(即左右图)来合成一个具有深度信息的立体图像,从而让观察者能够感受到三维空间的深度。这种技术广泛应用在虚拟现实、增强现实以及3D电影等领域。 在描述中提到的"基于2D的左眼和右眼...

    Python-Manim用于解释数学视频的动画引擎

    4. **代码驱动**:所有动画都是通过Python代码定义的,这使得脚本可读性强,易于维护,并且能够与其他Python库集成。 5. **灵活的输出格式**:Manim可以导出为静止图像序列、GIF动图或视频文件,适应不同的分享和...

    Eliza:一个用 Python 3 开发的 Eliza 聊天程序

    在Eclipse中,PyDev是一个强大的Python集成开发环境(IDE),提供了代码编辑、调试、自动完成、语法高亮等功能,极大地提升了开发效率。为了在PyDev中创建Eliza项目,你需要先安装Eclipse和PyDev插件。安装完成后,...

    webUI自动化测试框架(Python+selenium)

    Selenium与Python的结合使得测试代码编写更为简单,且易于维护。 在描述中提到的项目 "webTest" 是一个基于Python的WebUI自动化测试框架,可以从提供的github链接(https://github.com/wuranxu/webTest)获取源码。这...

Global site tag (gtag.js) - Google Analytics