gpt4 book ai didi

python - 使用 PyCLIPS 加载事实非常慢,而使用 CLIPS 加载速度很快

转载 作者:行者123 更新时间:2023-12-01 05:09:30 25 4
gpt4 key购买 nike

我有一个基于规则的系统,包含数十万个事实,而仅使用 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 以获得性能改进。

关于python - 使用 PyCLIPS 加载事实非常慢,而使用 CLIPS 加载速度很快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24476314/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com