簡體   English   中英

使用PyCLIPS時,事實加載非常慢,而使用CLIPS時,事實加載非常快

[英]Fact loading very slow with PyCLIPS, while fast with CLIPS

我有一個基於規則的系統,具有多個100K的事實,而PyCLIPS的性能卻很差,僅用於加載事實。

我將其縮小為一個簡單的示例,其中包含兩個模板和一個將它們連接在一起的規則(不執行其他操作):

import clips
import timeit

env = clips.Environment()
env.BuildTemplate('F1', '(slot x (type INTEGER))')
env.BuildTemplate('F2', '(slot x (type INTEGER))')
env.BuildRule('Rule1', '(F1 (x ?val)) (F2 (x ?val))', '')

N = 20000
with open('F1.txt', 'w') as f1:
    with open('F2.txt', 'w') as f2:
        for n in xrange(N):
            print >>f1, '(F1 (x {}))'.format(n)
            print >>f2, '(F2 (x {}))'.format(n)

print timeit.timeit(lambda : env.LoadFacts('F1.txt'), number=1)
print timeit.timeit(lambda : env.LoadFacts('F2.txt'), number=1)

輸出:

0.0951321125031
14.6272768974

因此,第二批20K事實加載需要14.6秒。 從CLIPS控制台立即加載相同的事實文件。 檢查N不同值可以發現加載時間大致與sqr(N)成正比(這使得它對於大量事實完全不可用)。

切換操作順序,並在加載事實后定義規則並不能使事情變得更好(很明顯,最后一個操作總是較慢的操作)。

有人熟悉這個問題嗎? 我是否以錯誤的方式使用PyCLIPS?

我正在運行PyCLIPS v1.0.7.348CLIPS v6.3

CLIPS 6.3在聯接中使用散列,以將變量從一種模式轉換為另一種模式。 當存在大量與示例中的事實和規則相似的事實和規則時,這可以大大提高性能。 在先前版本的CLIPS中,當斷言了一個新的F1事實時,將在與第二個模式匹配的所有F2事實上進行迭代(並且對於每個新的F2事實將發生類似的迭代)。 在6.3版中,僅對散列到相同存儲桶中的值val的事實進行迭代。 PyCLIPS網站上的自述頁面表明它是使用CLIPS 6.24編譯的,因此這可以解釋性能上的差異。 暫時,我不記得6.24和6.3之間的任何顯着API差異,因此可能可以使用較新版本的CLIPS重新編譯PyCLIPS以提高性能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM