重现unladen-swallow的性能对比实验

pyc逆向之opcode简单置换 最近做了一道pyc的逆向题,主要难点在于Python环境的opcode被置换,就简单记录一下相关知识。 opcode是什么 opcode其实是指Python源码的操作码,Python源代码*.py编译后可以得到二进制文件*.pyc,*.pyc文件中就含有opcode序列。对于不同版本的Python,其opcode是不完全相同的,这也就是为什么某一版本的Python虚拟机不能执行另一个版本的源... 阅读详情

unladen-swallow项目的失败实际上宣告了大幅度改变动态语言的性能是不可能的,个人觉得像python这样的动态语言改变他的性能的意义也不是特别大.没一种语言都有他实际的应用领域,其次随着计算机性能的越来越好,运行效率的问题不会显得太突出

我在编译unladen-swallow这个项目的时候,遇到一个很诡异的make错误:

-g -O3  -I. -IInclude -I../src -I../src/Include   -DPy_BUILD_CORE -o Python/bltinmodule.o ../src/Python/bltinmodule.c              #(这一行是ok的)

下一行的提示

../src/Python/makeopcodetargets.py ../src/Python/opcode_targets.h

:没有那个文件或目录#(no such file or directory)

make: *** [../src/Python/opcode_targets.h] 错误 127

我的第一反应是../src/Python/makeopcodetargets.py ../src/Python/opcode_targets.h 这两个东西是不是不存在,于是我去文件夹里面寻找了一下,发现这两个文件都存在的,于是我就想,是不是makeopcodetargets.py这个python脚本在运行的时候遇到以它所在的目录为当前目录,然后在当前目录下寻找../scr/Python/opcode_targets.h.于是我做了一下测试,发现脚本在运行的时候当前目录并没有改变.接下来我能想的就是看看makeopcodetargets.py这个文件里面倒是是什么,在下面我列了出来

#! /usr/bin/env python
"""Generate C code for the jump table of the threaded code interpreter
(for compilers supporting computed gotos or "labels-as-values", such as gcc).
"""

import imp
import os


def find_module(modname):
    """Finds and returns a module in the local dist/checkout.
    """
    modpath = os.path.join(
        os.path.dirname(os.path.dirname(__file__)), "Lib")
    return imp.load_module(modname, *imp.find_module(modname, [modpath]))

def write_contents(f):
    """Write C code contents to the target file object.
    """
    opcode = find_module("opcode")
    targets = ['_unknown_opcode'] * 256
    for opname, op in opcode.opmap.items():
        if opname == "STOP_CODE":
            # XXX opcode not implemented
            continue
        targets[op] = "TARGET_%s" % opname
    f.write("static void *opcode_targets[256] = {\n")
    f.write(",\n".join("\t&&%s" % s for s in targets))
    f.write("\n};\n")


if __name__ == "__main__":
    import sys
    assert len(sys.argv) < 3, "Too many arguments"
    if len(sys.argv) == 2:
        target = sys.argv[1]
    else:
        target = "Python/opcode_targets.h"
    f = open(target, "w")
    try:
        write_contents(f)
    finally:
        f.close()

这个.py中的代码有两个函数,find_module和write_contents.既然代码比较短,我就直接把这段代码的意思给看了.当然先从注释看起,可以看出这主要是生成一个c代码,为生成线程代码解释器的跳转表服务.看完之后发现问题也不在这儿.

既然都不是这写原因,那我只能去看make文件了,找到了对应的make文件的657行

$(OPCODETARGETS_H): $(OPCODETARGETGEN_FILES)
    $(OPCODETARGETGEN) $(OPCODETARGETS_H)

Python/eval.o: Python/eval.cc $(OPCODETARGETS_H)

奇葩了,完全没有问题,这是不是系统的原因,我用的是国产的linux deepin,于是我去实验室在ubuntu上重新实现了一下上面的过程,这个时候出现了新的问题。也就是/usr/include/gnu/stubs-32.h,no such file or directory。我对linux的内核不是特别了解,没法从根源去寻找原因,这个时候我就上网寻找答案,将网上可以有的答案都实现了一遍,发现还是没有解决问题。然后我去/usr/gnu文件夹下去寻找,发现确实没有stubs-32.h文件,但是有stubs.h和stubs-64.h。难道是因为我装的ubuntu 12.04 LTS导致stubs-32.h被装到别的地方去了?search文件,发现这个东西跑到/usr/include/i386-linux-gnu/gnu/里面去了。将其copy到/usr/include/gnu/里面,接着make。没有出现上面的奇葩问题,顺利通过编译。unladen-swallow 成功生成,看到python可执行文件略感欣慰,擦,废了哥一天时间

最后我将得到的优化后的python在benchmark上运行了一下,主要跑了一个django的程序,迭代100次。得到了unladen-swallow在llvm开启优化功能后的性能和未开启优化功能的运行效率对比,



Unladen-Swallow是隶属于Google的开源项目,初始目标:1)将Python的速度提高至少5倍;2)用它写出来的Python应用程序性能必须能十分稳定;3)提供与CPython源代码级的兼容;4)提供与CPython源代码级的扩展模块的兼容;5)这个项目会逐渐成为Python实现的一个独立的分支。这个项目将Python字节码架构在LLVM上面,利用LLVM的JIT编译器实现部分优化,保留Python其他部分不变,他这么做的原因是Python的大部分的运行时间用在eval循环里面。在Q1版本中,用vmgen[2]重新实现了eval核心循环,提高了垃圾回收和cPickle的性能,简化帧对象,提高全局和内建对象的查询速度;在Q2版本中加入了基于LLVM的JIT编译器;在Q3版本中将执行性能提高了15-70%。最后做了一个对比,将Q1和Q2以及Q3的性能分别做了一个测试并将我的方法用在Q1,Q2,Q3,Q4上面,得到了性能的提升。Q4和CPython的性能对比如上图所示。

从这两幅图片可以看出来,效率还是有一定的提高的,只是对于一个本来效率就不太高的语言来说,这样的提高有多大意义就另当别论了,但有一点是肯定的,这跟unladen-swallow开始的目标差的太远了……


如何浏览与下载全球免费的地图高分辨率(亚米级)的遥感影像? 前言 如果你想使用商业卫星的高分辨遥感影像,一般价格昂贵。我们可以使用地图平台上免费的高分辨率数据。目前数据源很多,比如说google earth、天地图、四维地球、必应地图等等。这些影像统一有一个共同点就是:RGB三波段;Web地图瓦片服务。这意味着我们可以通过瓦片服务下载影像,但下载的影像只有三个波段,分别是 一.引言 二、可使用高分辨率的地图数据源 1.Google Earth影像 2.Esri World Image 3.天地图 4.必... 阅读详情

相关推荐

.NET MAUI跨平台串口通讯方案

MAUI跨平台串口通信架构设计采用分层模式,核心是共享业务逻辑层与平台特定实现。通过定义统一的ISerialPortService接口,实现了Windows、Android、iOS和macOS四大平台的串口通信功能。Windows平台使用System.IO.Ports类库,Android通过USB Host模式实现,iOS基于ExternalAccessory框架,macOS则采用IOKit。该设计支持串口连接管理、数据收发等核心功能,并通过事件机制实现异步通信。架构采用条件编译区分各平台实现,确保代码复用

冰茶的博客 1664

Unladen Swallow 的失败与教训以及PyPy

转:http://fosschef.com/2011/04/the-failure-of-unladen-swallow-and-the-lessons/ 在淡出人们的视线近一年之后,Unladen Swallow 这个曾经被 Python 用户寄予厚望,号称要将 Python 性能提高5倍的 Python 分支,最近似乎真的走到了尽头。来自 Unladen Swallow 的开发人

mali_xiangzi的专栏 1030

树莓派计算模块摄像头连接与配置全攻略:从硬件跳线到软件驱动

在嵌入式视觉项目中,摄像头模组的连接与驱动是图像采集和视频分析的基础。其核心原理是通过CSI-2高速串行接口协议传输图像数据,并依赖I2C总线进行传感器寄存器配置。这一技术方案的价值在于为工业控制、机器人等嵌入式设备提供了稳定、高性价比的视觉感知能力。在实际应用中,开发者常面临摄像头无法识别、I2C通信失败等挑战,尤其是在使用树莓派计算模块时,其硬件接口需要通过I/O板引出,配置过程涉及设备树参数调整等关键步骤。本文聚焦于解决这些实际问题,详细拆解了从硬件连接到软件驱动的完整流程,特别是针对CM4、CM3+

weixin_29184075的博客 336

Python开发效率翻倍工具集!

这篇文章会提供一些优化代码的工具。会让代码变得更简洁,或者更迅速。当然这些并不能代替算法设计,但是还是能让 Python 加速很多倍。其实前面讲算法的文章,也有提到过。比如适用于双向队列的 deque,以及在合适的条件下运用 bisect 和 heapq 来提升算法的性能。而且前面也提到过,Python 提供了当今最高级也是最有效的排序算法(list.sort)。另外还有一个功能多样又迅速的散列表(dict)。而且如果写迭代器封装、功能性代码或者是某种额外扩展的时候,或许CyToolz可以用得到。

Python栈 119

《网络安全自学教程》- SQL注入之报错注入原理+步骤+实战操作

这篇文章为大家解析报错注入的实现原理,结合实战案例讲解报错注入的使用步骤。

wangyuxiang946的博客 1万+

华为OD机试真题 新系统 2026-05-13 Python&JS语言 实现【查找能被整除的最大整数】

给定一个字符串和一个正整数,字符串由大小写字母和数字组成,要求从字符串中找出最大且能被给定正整数整除的数。

MISAYAONE的博客 224

Unladen Swallow的最后时光

unladen swallow尝试将LLVM优化引入到CPython运行时,但是去年却没有取得重大进展。现在,一篇回顾unladen swallow的文章已经确认了这个项目的死亡,不会再进行开发。\它的目标曾经是多么野心勃勃;引入LLVM运行时架构作为CPython的解释器,然后将其作为一个选项,能够在JIT编译的时候打开。LLVM被用在一些高端项目中,例如全新的Clang模块编译器以及LLDB调...

cpongo5 289

西南科技大学数字电子技术实验七(4行串行累加器设计及FPGA实现)FPGA部分

/在k=1时输入1,并在k=0时运算。//在k=1时输入0,并在k=0时运算。//在k=1时输入1,并在k=0时运算。//在k=1时输入0,并在k=0时运算。//在k=1时输入1,并在k=0时运算。//在k=1时输入1,并在k=0时运算。//在k=1时输入0,并在k=0时运算。//在k=1时输入0,并在k=0时运算。三、程序清单(每条语句必须包括注释或在开发窗口注释后截图)四、综合、管脚分配、生成输出文件、下载(所有步骤截图)五、仿真程序清单、波形(波形截图必做,截图!.k(k),//开关。

Welcome To My6n Blog 4332

Python 变得更快的一份加速工具清单

这篇文章会提供一些优化代码的工具。会让代码变得更简洁,或者更迅速。 当然这些并不能代替算法设计,但是还是能让 Python 加速很多倍。 其实前面讲算法的文章,也有提到过。比如适用于双向队列的 deque,以及在合适的条件下运用 bisect 和 heapq 来提升算法的性能。 而且前面也提到过,Python 提供了当今最高级也是最有效的排序算法 (list.sort)。 另外还有一个功能多样又迅速的散列表 (dict)。而且如果写迭代器封装、功能性代码或者是某种额外扩展的时候,或许CyToolz.

给我一点温度 661

【AIGC】大模型面试高频考点07-注意力(Attention)篇

AIGC面试高频考点

一个内容严谨、方向前沿、极具实践价值的AI大模型技术分享站 3363

迟滞比较器原理及计算

为什么要用迟滞比较器 在讲迟滞比较器之前,我们先看一个案例。 在产品设计中常常需要用到电机,而电机在从运转到停止过程中需要泄放能量,这种能量大部分以电压的形式反馈回电源母线(Vbus)导致Vbus母线电压升高,特别是功率大又转速快的电机需要急刹时,产生的反馈电压更高,严重时可能导致母线上其他器件的损坏。 为了防止将电机反馈的能量泄放掉,我们需要设计一个电路来检测母线电压,当母线电压高于某一安全阈值时,打开MOSFET Q1将母线上的能量通过电阻R5以热的形式消耗掉。 假如用一般的比较器,设计如下: Vbu

sinat_15677011的博客 2万+

Unladen Swallow项目计划

原文链接:  http://code.google.com/p/unladen-swallow/wiki/ProjectPlan 译文链接: http://danmarner.yo2.cn/unladen-swallow-project-plan 原著: Google  译者: DaNmarner 欢迎转载,请保留原/译文链接。 =========================Unladen

Daniel.Chan的博客 1351

YOLOv12改进策略【卷积层】| CVPR-2020 利用DynamicConv 动态卷积 结合A2C2f进行二次创新,提高精度

在大规模视觉预训练中,通常模型的性能受到数据、参数和FLOP三个关键因素的影响。一般来说,模型的参数数量越多,FLOP也越高,但在移动设备等对计算资源有限制的场景下,需要低FLOP的模型同时又希望模型能从大规模预训练中受益。传统的方法很难在增加参数的同时保持低FLOP,因此需要一种新的设计来解决这个问题,模块应运而生。

Limiiiing的博客 827

Unladen Swallow 2009Q2

http://code.google.com/p/unladen-swallow/wiki/Release2009Q2 Unladen Swallow 2009Q2 Unladen Swallow 2009Q2 is the first release of Unladen Swallow to use  LLVM for native code generation. To ob

肥三的专栏 3125

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

python编辑环境_构建一个自定义Python编译器环境(修改操作码)的Docker容器

背景老大: python 源码要加密,不给看...大灰狼先生:好嘞!实现实现加密网传可行的有2种方式,代码变量混淆,修改编译器操作码(此文采用的方式)两步:修改 python 编译器,使得 只有 该特定的编译器才能执行 对应的 pyc 文件将基础环境打包成 docker 镜像,作为程序发布的基础镜像1. 修改操作码方法介绍修改 python 源码文件相关的目标文件有三个Lib/opcode.pyI...

weixin_39805409的博客 398

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

***没有规则可以创建“XXX”需要的目标“XXX”问题的解决方案

在第4季 上学期  专题2-U-Boot新手入门中, 1,在Linux中解压uboot_tq2440.tar.gz 2,tar xvzf uboot_tq2440.tar.gz 3,进入 uboot_tq2440/  4,make TQ2440_config  (对TQ2440开发板进行配置) 5,make ARCH=arm CROSS_COMPILE=arm-linux-   (进行编

daa20的专栏 2万+

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

PHP Opcode缓存总结

PHP Opcode缓存总结发布日期:2014-02-24 09:24来源:互联网作者:网络点击:4421.Zend Optimizer v3.x.x v2.x.x在PHP-5.2.x以前的PHP版本使用,用优化代码的方法来提高PHP应用程序的执行速度,理论上要比不使用ZO要快40%-100%。实现的原理是对那些在被最终执行之前由运行编译器(Run-Time Compiler...

weixin_34162629的博客 183

C++11新特性

1、C++11 中的 override 关键字 在派生类的成员函数中使用override时,(1)如果基类中无此函数,或基类中的函数并不是虚函数,编译器会给出相关错误信息。(2)显式的在派生类中声明时,哪些成员函数需要被重写,如果没被重写,则编译器会报错。 2、基于范围的 for 循环 std::vector<int> arr(5, 100); for(std::vector<int>::iterator iter = arr.begin(); iter != arr.end

Swallow_he的博客 269

问题之~没有规则可以创建 ...需要的目标....

使用make distclean命令即可以解决。 make distclean 类似于make clean,make clean 清除上次make命令生成的object文件及可执行文件。 make distclean 命令更彻底,同时将configure生成的文件全部删除(包括Makefile文件)。

Leonban的博客 5145

**没有规则可以创建“XXX”需要的目标“XXX”问题的解决方案

该博文参考:snowboy.blog.chinaunix.net,感谢这位博主讲解。 一、现象       我将之前Redhat9.0编译好的uboot,转到ubuntu12.04环境。在ubuntu环境下对 uboot重新编译提示错误。编译过程如下:     root@hailin-virtual-machine:/home/hailin/桌面/dream/tx2440/uboot/u-b

hailin0716的专栏 3万+

从底层理解Python的执行

摘要:是否想在Python解释器的内部晃悠一圈?是不是想实现一个Python代码执行的追踪器?没有基础?不要怕,这篇文章让你初窥Python底层的奥妙。 【编者按】下面博文将带你创建一个字节码级别的追踪API以追踪Python的一些内部机制,比如类似YIELDVALUE、YIELDFROM操作码的实现,推式构造列表(List Comprehensions)、生成器表达式(generator

Daemon的专栏 4555

设计模式之观察者设计模式(C++实现)

观察者模式 观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。 当一件事发生改变,会引

行走 751

Python的垃圾回收机制

1.1    Python的垃圾回收机制 很多文献没有对Python的垃圾回收进行非常详细的描述,这里将重点介绍一下Python的垃圾回收机制。Python采用自动和手动相结合的垃圾回收方法,其原理基于引用计数和分代垃圾回收以及标记-清除。 通常情况下,Python会使用引用计数的方式回收垃圾,即任何一个对象的引用计数为0的时候就立刻回收这个对象占有的内存。众所周知,引用计数的方法无法回收

logarrow的专栏 1508

python的作用域规则

众所周知,python以前的作用域规则为LGB,后来改成了LEGB。 L: local,  E: enclosure,  G: global,  B: builtin 我想L,G,B大家都知道是什么,这个E是python后来引入的一个新的作用域叫嵌套作用域。嵌套作用域和闭包是分不开的,关于闭包,我在另一篇博文中会进行说明 为了研究这种作用域规则对函数类等的影响,我将从python

logarrow的专栏 1356

Python中的装饰器

装饰器主要用途是包装另一个函数或者类。这种包装主要是为了透明地修改或者增强被包装对象的行为。装饰器的语法是特殊符号@——这是《Python参考手册》里面描述的。 装饰器其实就是一个函数,这个函数将另一个函数或者类作为参数,并返回经过处理的类或者函数。下面讨论一下装饰器的具体用法,即大家在实际想要使用装饰器的时候到底怎么写呢。 首先我想说的是当用装饰器函数去装饰一个函数的时候可以将装饰器

logarrow的专栏 1121
上一篇: python中的闭包
下一篇: Python中的装饰器
和道一文字JC
博客等级 码龄19年 24粉丝 178原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值