Python保存了一个eval函数

时间:2017-05-04 08:22:51

标签: python python-2.7 eval

假设我有一个函数fun(f, x, y),其中x和y是数字,f是指定"1 / x ** 2 + y"等函数的字符串。

我希望使用此功能f,比如几百万次,xy的值会在每次使用之间发生变化。
因此,调用eval(f)需要花费大量时间,而不是每次只计算函数的值。 (在我测量的情况下,大约50倍。)

有没有办法保存此功能f,以便我只需要拨打eval一次?

PS。请不要在此讨论使用eval的(联合国)安全性,我知道这一点,但此代码并未转到第三方的任何地方将运行它,也不是我的问题。

2 个答案:

答案 0 :(得分:9)

你可以lambda s = "1 / x ** 2 + y" s = "lambda x,y: "+s f = eval(s) x = 2 y = 3 print(f(x,y)) ,所以你只需要评估一次,之后它就是你可以使用的功能:

3.25

我得到x,但我可以多次更改ypublic class Home_fragment extends Fragment { ViewFlipper viewFlipper; int[] images = {R.drawable.home_first, R.drawable.home_second, R.drawable.home_third}; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { final View view = inflater.inflate(R.layout.home_fragment, container, false); viewFlipper = (ViewFlipper) view.findViewById(R.id.simpleViewFlipper); for (int i = 0; i < images.length; i++) { ImageView imageView = new ImageView(getActivity()); imageView.setImageResource(images[i]); viewFlipper.addView(imageView); } Animation in = AnimationUtils.loadAnimation(getActivity(), android.R.anim.slide_in_left); Animation out = AnimationUtils.loadAnimation(getActivity(), android.R.anim.slide_out_right); viewFlipper.setInAnimation(in); viewFlipper.setOutAnimation(out); viewFlipper.setFlipInterval(3000); viewFlipper.setAutoStart(true); return view; } } ,而无需再次评估表达式。

答案 1 :(得分:0)

如果Jean_Francois&#39;解决方案仍然不够快,你可以看看numba。 f_numba = jit(f),然后也可能@jit调用f_numba的函数,以便f_numba内联到调用者。取决于您的申请。