2011-06-16 74 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