当前位置: 首页 > 面试题库 >

Python:加快重复执行的eval语句的方法?

段干麒
2023-03-14
问题内容

在我的代码中,我eval用来评估用户给出的字符串表达式。有没有办法编译或加快此语句的速度?

import math
import random

result_count = 100000
expression = "math.sin(v['x']) * v['y']"

variable = dict()
variable['x'] = [random.random() for _ in xrange(result_count)]
variable['y'] = [random.random() for _ in xrange(result_count)]

# optimize anything below this line

result = [0] * result_count

print 'Evaluating %d instances of the given expression:' % result_count
print expression

v = dict()
for index in xrange(result_count):
    for name in variable.keys():
        v[name] = variable[name][index]
    result[index] = eval(expression) # <-- option ONE
    #result[index] = math.sin(v['x']) * v['y'] # <-- option TWO

为了进行快速比较,选项ONE在我的计算机上花费了2.019秒,而选项TWO仅花费了0.218秒。当然,Python无需硬编码表达式就可以做到这一点。


问题答案:

您还可以欺骗python:

expression = "math.sin(v['x']) * v['y']"
exp_as_func = eval('lambda: ' + expression)

然后像这样使用它:

exp_as_func()

速度测试:

In [17]: %timeit eval(expression)
10000 loops, best of 3: 25.8 us per loop

In [18]: %timeit exp_as_func()
1000000 loops, best of 3: 541 ns per loop

附带说明一下,如果v不是全局变量,则可以这样创建lambda:

exp_as_func = eval('lambda v: ' + expression)

并称之为:

exp_as_func(my_v)


 类似资料:
  • exec语句用来执行储存在字符串或文件中的Python语句。例如,我们可以在运行时生成一个包含Python代码的字符串,然后使用exec语句执行这些语句。下面是一个简单的例子。 >>> exec 'print "Hello World"' Hello World eval语句用来计算存储在字符串中的有效Python表达式。下面是一个简单的例子。 >>> eval('2*3') 6

  • 本文向大家介绍pycharm在调试python时执行其他语句的方法,包括了pycharm在调试python时执行其他语句的方法的使用技巧和注意事项,需要的朋友参考一下 以前一直习惯用matlab,断点调试时可以进行各种操作。在这一点上python的便利性远不如matlab。不过pycharm这个软件却可以调试python,并且可以在中断的时候执行其他语句。我百度到的一些教程都是说让改下配置。但在我

  • 问题内容: 我在理解同步关键字功能时遇到了一些麻烦。根据Java文档和其他教程,可以说,当使用synced关键字时,在两个线程之间不可能在该方法的语句之间进行交织。 但是,请参见下面的代码。 据我了解,程序输出应始终以线程0和线程1不应交错的方式进行。但是多次执行这段代码后,我得到了交错输出。 请帮助我理解问题。 提前致谢.. 问题答案: 的关键字防止两个线程运行的是在同一对象上同步代码。 您的每

  • 本文向大家介绍SQL Server 2005 定时执行SQL语句的方法,包括了SQL Server 2005 定时执行SQL语句的方法的使用技巧和注意事项,需要的朋友参考一下 SQL SERVER 2005有定时任务,你可以启动一下。不过要想更加直观的控制,直接写一个程序,定时执行你的存储过程。 1、设置“SQL Server 代理”(SQL Server Agent)服务随系统启动 --我的电脑

  • 我有一个问题,我在测试中也找不到答案。方法pos和neg对我不起作用。 假设我们有一个简单的类: 现在,我想重写magic方法,它在我做语句时被调用: 如果是c: 但我不知道是哪个?请给我一些建议。

  • 我需要重写执行程序的执行方法,我需要改变线程超过核心池大小的行为,只有当队列已满时才会创建。 然而,在实时应用程序中,这种行为是不可取的,因为它会导致队列中存在的任务无休止地等待。 我已将execute方法更改如下: 尝试实现:核心线程-