小编Nic*_*lfi的帖子

如何让Python使用Assembly

我是汇编的初学者,但是Python的高手.我刚刚开始学习Windows的x86_64 NASM,我希望结合汇编的强大功能和Python的灵活性.我已经看了一遍,我还没有找到一种方法在Python中使用NASM汇编程序.通过这个我不是指在线组装.我希望编写一个汇编程序,编译它,然后以某种方式提取在我的Python程序中使用的过程.有人能说明一个如何做到这一点的简单例子,因为我完全迷失了.

python windows 64-bit assembly

11
推荐指数
2
解决办法
1万
查看次数

获取命令distutils传递给编译器

假设我在setup.py脚本中有这个Python代码来构建C扩展:

from distutils.core import setup, Extension

module1 = Extension('demo', sources = ['demo.c'])

setup (name = 'PackageName',
       version = '1.0',
       description = 'This is a demo package',
       ext_modules = [module1])
Run Code Online (Sandbox Code Playgroud)

很容易.现在我setup.py用这一行调用脚本:

C:/> python setup.py build_ext --compiler=mingw32
Run Code Online (Sandbox Code Playgroud)

好的,但问题是什么?

当distutils调用mingw32并将所有必需的操作系统独立标志和选项传递给它时,它如何计算出这些标志?

distutils在哪里保留与每个平台相关的命令,以及如何访问它们?

python command-line gcc distutils compilation

10
推荐指数
1
解决办法
784
查看次数

Python列表中的额外元素

使用Cython,我试图将Python列表转换为Cython数组,反之亦然.Python列表包含0到255范围内的数字,因此我将数组的类型指定为unsigned char数组.这是我的代码来进行转换:

from libc.stdlib cimport malloc

cdef to_array(list pylist):
    cdef unsigned char *array 
    array = <unsigned char *>malloc(len(pylist) * sizeof(unsigned char))
    cdef long count = 0

    for item in pylist:
        array[count] = item
        count += 1
    return array

cdef to_list(array):
    pylist = [item for item in array]
    return pylist

def donothing(pylist):
    return to_list(to_array(pylist))
Run Code Online (Sandbox Code Playgroud)

问题在于,在Cython数组中生成了多条垃圾数据,并且当转换为Python列表时,垃圾数据会继续存在.例如,donothing应该什么都不做,并将python列表返回给我,不变.这个函数只是用于测试转换,但是当我运行它时,我得到类似的东西:

In[56]:  donothing([2,3,4,5])
Out[56]: [2, 3, 4, 5, 128, 28, 184, 6, 161, 148, 185, 69, 106, 101]
Run Code Online (Sandbox Code Playgroud)

这些数据来自代码中的哪里,以及如何清理这些垃圾以免浪费内存?

PS可能有更好的从Python列表中获取数字并将它们注入unsigned char数组的版本.如果是这样,请完全指导我一个更好的方法.

python cython

8
推荐指数
1
解决办法
369
查看次数

获取Cython指针的值

我正在编写一个构造unsigned char *malloc'd数组的函数,然后返回指针.在纯Cython或C中,这很容易.您所要做的就是在函数上设置返回类型,并将指针返回到数组.完成.但是,我已经达到了一个点,我需要将一个指向Cython中创建的数组的指针返回给Python.我知道指针只是内存地址.有没有什么方法可以返回一个Cython指针到Python作为python对象(如int或hex,因为内存地址本质上是一个数字),所以我可以基本上管理python中的指针?

我试图像这样返回指针的值:

cdef unsigned char array[8]

def return_pointer():
    return &array
Run Code Online (Sandbox Code Playgroud)

这当然不起作用,因为转换不能完成.Cython抱怨Cannot convert 'unsigned char (*)[8]' to Python object.有什么建议?

编辑:

我不需要访问Python中指针引用的内存地址中的值,只传递指针.然后我计划使用Python对象指针,并以它作为参数调用c函数.

c python pointers cython

7
推荐指数
1
解决办法
5190
查看次数

自定义大小数组

简单问题陈述:

是否可以在C或Cython 中拥有自定义大小数据类型(3/5/6/7字节)的数组?

背景:

在尝试编写复杂算法时,我遇到了主要的内存低效问题.该算法要求存储令人兴奋的数据量.所有数据都排列在一个连续的内存块中(如数组).数据只是一个很长的[通常]非常大的数字列表.给定一组特定数字时,此列表/数组中的数字类型是常量(它们几乎作为常规C数组运行,其中所有数字在数组中的类型相同)

问题:

有时,将每个数字存储在标准数据大小中效率不高.通常正常的数据类型是char,short,int,long等...但是如果我使用int数组来存储一个数据类型,该数据类型只能存储在3个字节的范围内,那么在每个数字上我丢失1个字节空间.这会造成极端低效率,当你存储数百万个数字时,效果会破坏内存.遗憾的是,没有其他方法可以实现算法的解决方案,我相信自定义数据大小的粗略实现是唯一的方法.

我尝试了什么:

我曾尝试使用char数组来完成此任务,但在大多数情况下,不同的0 - 255值位之间的转换形成更大的数据类型效率很低.很多时候,有一种数学方法可以采用字符并将它们打包成更大的数字,或者取更大的数字,并将其各个字符分开.这是一个非常低效的算法,用Cython编写:

def to_bytes(long long number, int length):
    cdef:
        list chars = []
        long long m
        long long d

    for _ in range(length):
        m = number % 256
        d = number // 256
        chars.append(m)
        number = d

    cdef bytearray binary = bytearray(chars)
    binary = binary[::-1]
    return binary

def from_bytes(string):
    cdef long long d = int(str(string).encode('hex'), 16)
    return d
Run Code Online (Sandbox Code Playgroud)

请记住,我并不完全希望对此算法进行改进,而是一种声明某种数据类型数组的基本方法,因此我不必进行此转换.

c python arrays cython

5
推荐指数
1
解决办法
374
查看次数

从Python中返回包含和运行时lib目录

让我们说我想gcc从命令行使用,以编译Python的C扩展.我将这样的调用结构如下:

gcc -o applesauce.pyd -I C:/Python35/include -L C:/Python35/libs -l python35 applesauce.c
Run Code Online (Sandbox Code Playgroud)

我注意到-I,-L-l选项是绝对必要的,否则你会得到类似如下的错误.这些命令告诉gcc在哪里查找headers(-I),在哪里查找静态库(-L),以及实际使用哪个静态库(python35实际转换为libpython35.a).

现在,显然很容易获得libsinclude你的机器一样的目录,因为如果你不想让它们永远不会改变.但是,我正在编写一个gcc从命令行调用的程序,其他人将使用该程序.发生此调用的行看起来像这样:

from subprocess import call
import sys
filename = applesauce.c
include_directory = os.path.join(sys.exec_prefix, 'include')
libs_directory = os.path.join(sys.exec_prefix, 'libs')

call(['gcc', ..., '-I', include_direcory, '-L', libs_directory, ...])
Run Code Online (Sandbox Code Playgroud)

但是,其他人将拥有不同的平台和不同的Python安装结构,因此只是加入路径并不总是有效.

相反,我需要Python中的一个解决方案,它将可靠地返回includelibs目录.

编辑:

我查看了该模块distutils.ccompiler,发现了许多有用的函数,它们部分地使用了distutils,但是让我可以自定义我的编译器完全跨平台.唯一的问题是,我需要传递包含和运行时库...

编辑2:

我看了一下distutils.sysconfig,我能够可靠地返回包含所有头文件的'include'目录.我仍然不知道如何获取运行时库.

该 …

python gcc static-libraries python-c-extension

5
推荐指数
2
解决办法
149
查看次数

装配零和相等之间的差异

我是一个在广阔的装配世界中的完全初学者,在学习的过程中,我遇到了一个奇怪的事情.

条件跳转是在标志检查的基础上完成的,以查看某些运算符如何比较.但是,似乎有两种不同的方法来进行检查.几乎每个条件跳转指令,似乎都有一个完全相同的对应物,只是用不同的符号.例如,je似乎是相同的jz.据我所知,如果在指令设置零标志之前比较两个操作数,这两条指令都会跳转.这里的说明有什么区别.一个比另一个更有效吗?是否会产生更多开销?区别仅在于可读性吗?

还有一些其他说明似乎也是一样的:

  • loopz/loope
  • jb/jc
  • jnz/jne

comparison x86 assembly instructions

2
推荐指数
1
解决办法
314
查看次数

Python 列表的二进制布局

我正在编写一个程序,我需要了解 Python / Cython 中不同数据容器的效率(内存方面)。所述容器之一是标准Pythonlist

Python 列表让我很困惑,因为我不知道它在二进制级别上是如何工作的。与Python不同,C的数组很容易理解,因为所有元素都是相同的类型,并且空间是提前声明的。这意味着当程序员想要进入并索引数组时,程序从数学上知道要转到哪个内存地址。但问题是,Python 列表可以存储许多不同的数据类型,甚至可以存储列表内的嵌套列表。这些数据结构的大小一直在变化,并且列表仍然保存它们,说明这些变化。是否存在额外的分隔符内存以使列表保持动态?

如果可以的话,我会很感激 RAM 中示例列表的实际二进制布局,并用每个字节代表的内容进行注释。这将帮助我完全理解列表的内部工作原理,因为我正在二进制级别上工作。

python list

1
推荐指数
1
解决办法
1455
查看次数