我一直在爲這個項目工作了幾個月。該項目的最終目標是評估類似於功能測試的整個數字邏輯電路;只是爲了給出一個問題的範圍。我在這裏創建的主題處理我在分析布爾表達式時遇到的問題。對於數字電路內的任何門電路,其輸入表達式均以全局輸入表示。 EX:((A&B)|(C&D)^E)
。然後,我想要用這個表達式來計算所有可能的結果,並確定每個輸入對結果的影響程度。在Python中評估布爾表達式作爲字符串的更快方法
我發現的最快方法是通過構建一個真值表作爲矩陣並查看某些行(不會考慮該算法的細節,因爲它是不重要的),這個問題就是一次唯一的數量輸入高於26-27(大約在那個)內存使用遠遠超過16GB(我的電腦最大)。你可能會說「購買更多內存」,但隨着輸入每增加1,內存使用量就會增加一倍。我分析的一些表達式超過200個獨特的輸入...
我現在使用的方法現在使用編譯方法將表達式作爲字符串。然後我創建一個數組,其中包含從編譯方法中找到的所有輸入。然後,我從一個可能值的樣本中隨機選擇一行「True」和「False」生成列表行(如果樣本大小與範圍大小相同,它將相當於真值表中的行)將允許我限制樣本大小,當事情變得太長而無法計算時)。然後將這些值與輸入名稱一起壓縮並用於評估表達式。這會給出初始結果,然後我在隨機布爾列表中按列逐列,然後翻轉布爾值,然後再次用輸入壓縮並再次評估,以確定結果是否改變。
所以我的問題是這樣的:有沒有更快的方法?我已經包含了執行這項工作的代碼。我試過正則表達式來查找和替換,但它總是比較慢(從我所見過的)。考慮到內循環將運行N次N是唯一輸入的數量。 for循環外我限制運行2^15,如果ň> 15.因此,這變成EVAL執行Min(2^N, 2^15) * (1 + N)
...
作爲更新澄清我是問究竟是什麼(對不起,任何混亂)。計算我所需要的算法/邏輯不是問題。我正在尋求一種替代python內置的'eval'來更快地執行相同的事情。 (以布爾表達式的格式取一個字符串,將字符串中的變量替換爲字典中的值,然後計算字符串)。
#value is expression as string
comp = compile(value.strip(), '-', 'eval')
inputs = comp.co_names
control = [0]*len(inputs)
#Sequences of random boolean values to be used
random_list = gen_rand_bits(len(inputs))
for row in random_list:
valuedict = dict(zip(inputs, row))
answer = eval(comp, valuedict)
for column in range(len(row)):
row[column] = ~row[column]
newvaluedict = dict(zip(inputs, row))
newanswer = eval(comp, newvaluedict)
row[column] = ~row[column]
if answer != newanswer:
control[column] = control[column] + 1
我建議不要使用'eval()'你可以閱讀它[這裏](http://stackoverflow.com/a/1087625/1982962)。 –
「每個輸入對結果有多大影響」 - 您能否澄清這部分內容的含義?取決於你想要的,你的問題可能是[NP-hard](http://en.wikipedia.org/wiki/NP-hard),但它仍然可行。 – user2357112
@KobiK,這是一種安全風險,你知道... –