`
lin_llx
  • 浏览: 127596 次
  • 性别: 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微表情识别论文实现代码"涉及到了深度学习在微表情检测与识别中的应用,这在心理学、人机交互和行为分析等领域具有广泛的应用价值。 首先,让我们深入理解微表情识别的挑战。由于微表情的短暂...

    连铸切割的在线优化.pdf

    通过这一系列的研究,我们不仅能够感受到数学建模在解决实际工程问题中的强大应用潜力,而且也意识到,在复杂多变的生产环境中,寻找动态平衡和优化的重要性。连铸切割的在线优化问题的探讨,是数学建模在工业领域...

    欢乐斗地主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...

    Apress Python Algorithms (pdf+epub+源碼)

    冒泡排序、插入排序、选择排序、快速排序、归并排序以及堆排序等经典排序算法不仅在理论上有详尽的阐述,更辅以Python代码实现,使读者能够直观感受到算法的具体运作。此外,作者还对这些排序算法的效率进行了比较,...

    《程序员数学 》用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动图或视频文件,适应不同的分享和...

Global site tag (gtag.js) - Google Analytics