2011-06-16 41 views
2

我想在Python中对C语言计算进行一些模拟。 例如,无符号短,单精度浮点数...如何在Python中进行C语言计算

ushort(0xffff) + 1 -> 0 
0.1f * 0.1f -> ... 

是否有一些图书馆在Python做到这一点?

我可以使用ctypes的创建无符号短,单精度浮点数,但他们 水湿做数学运算:

a = c_uint16(0xffff) 
b = c_uint16(0x01) 
a+b -> TypeError 

或者,我可以用numpy的:

>>> np.uint16(0xffff) + np.uint16(0x01) 
Warning: overflow encountered in ushort_scalars 
0 

但很与Python的正常计算相比较慢:

>>> timeit.timeit("a+b", "import numpy as np;a=np.uint16(0xfffe);b=np.uint16(0x01)") 
0.35577465681618037 
>>> timeit.timeit("0xfffe+0x01") 
0.022638104432360251 
>>> timeit.timeit("np.uint16(0xfffe) + np.uint16(0x01)", "import numpy as np") 
5.904765399236851 

编辑:

>>> timeit.timeit("a+b", "a=0xfffe;b=0x01") 
0.040062221014295574 
+0

怎么样:'def add(a,b):return(a + b )%65536'? – JBernardo 2011-06-16 02:21:43

回答

6

编译0xfffe+0x01时,将折叠成常数65535。你是不是定时除了需要多长时间 - 你只是测量加载常数的时间:

>>> dis.dis(compile("0xfffe+0x01", "", "eval")) 
    1   0 LOAD_CONST    2 (65535) 
       3 RETURN_VALUE   

加入NumPy的标量要比添加内置整数但速度较慢,但​​不会比纯Python中的更好。考虑使用Cython - 它将允许您声明类型并以C速度执行计算。或者,尝试在NumPy中引导您的代码(也就是说,如果速度真的很重要)。

+1

是的,动名词与不定式的事情没有太大关系吗?我看到这个后就想到了它。例如“尝试使用cython”和“尝试使用cython”都是惯用的英语,但它们意味着微妙的不同;前者意味着像“通常情况下使用cython,如果可以的话”,而后者更接近“考虑使用cython”。 (对于它的价值,它可能应该是“学习更好的英语”。)所有这些说,我的意思是,一般来说,你的帖子是一尘不染的。现在我知道你不介意直接编辑,也许我会在下一次做。 – senderle 2011-06-16 02:19:50

+0

@senderle:再次感谢 - 我会在我的个人资料中澄清消息! – 2011-06-16 02:22:20

1

您可以使用模%2**sizeof每个操作的功能(在你的情况下,2 ** 16或65536)

def add(a, b, mod=2**16): 
    return (a+b) % mod 

def sub(a, b, mod=2**16): 
    return (a-b) % mod 

和其它任何你需要的功能。

>>> add(0xffff, 1) 
0 
>>> sub(10, 20) 
65526 

注意这只适用于无符号类型。对于带符号的数字,你可以使用一半的数值用于mod(即2 ** 15),并且在应用模数之前必须验证结果

+0

谢谢,你的方法对整数有用。对于单个浮点数,我正在考虑使用ctypes调用某个DLL。 – HYRY 2011-06-16 05:15:28