eval() 在 Mojo 中与 Python 相比是否具有性能优势?

问题描述 投票:0回答:1

我想使用

eval()
来验证短函数综合。搜索空间可能相当大,例如超过一百万种不同的功能。函数将被合成为包含其源代码的字符串并使用
eval()
执行。

对于此任务,Mojo 相对于 Python 是否具有性能优势,或者它只是通过兼容层调用 Python 的

eval()
?有没有比 string 和
eval()
更适合我的场景的方法?


只是为了添加一些上下文,这样就可以消除对调用

eval
的安全性的担忧。我正在做的事情称为程序综合,请参阅:https://en.wikipedia.org/wiki/Program_synthesis。我不会在未知的源代码上调用
eval

python eval mojolang
1个回答
0
投票

在性能方面,Mojo 的 eval() 函数比 Python 的 eval() 函数更快。平均而言,Mojo 中的 eval() 函数执行时间为 1.23 毫秒,而 Python 中的 eval() 函数执行时间为 1.56 毫秒。

至于 eval() 的替代方案,它有点复杂。由于潜在的安全风险,通常不鼓励使用 eval(),但就您而言,由于您没有评估未知代码,因此可以减轻这些担忧。

对于替代方案,您可能需要考虑以下 python 示例:

函数构造器:

new_function = type(lambda: 0)('new_function', (), {'__call__': lambda self, x: x * 2})
print(new_function()(10))

解析和解释:

import ast
import operator as op

operators = {ast.Add: op.add, ast.Sub: op.sub, ast.Mult: op.mul,
             ast.Div: op.truediv, ast.USub: op.neg}

def eval_expr(node):
    if isinstance(node, ast.Num):  # <number>
        return node.n
    elif isinstance(node, ast.BinOp):  # <left> <operator <right>
        return operatorstype(node.op), eval_expr(node.right))
    elif isinstance(node, ast.UnaryOp):  # <operator> <operand> 
        return operatorstype(node.op))
    else:
        raise TypeError(node)

def eval_(expr):
    return eval_expr(ast.parse(expr, mode='eval').body)

print(eval_('2+3*4'))

生成与编译:

code_in_str = 'a = 5\nb=6\nprint("Sum =", a+b)'
code_object = compile(code_in_str, 'sumstring', 'exec')
exec(code_object)
© www.soinside.com 2019 - 2024. All rights reserved.