假设我有一个函数fun(f, x, y)
,其中x和y是数字,f是指定"1 / x ** 2 + y"
等函数的字符串。
我希望使用此功能f
,比如几百万次,x
和y
的值会在每次使用之间发生变化。
因此,调用eval(f)
需要花费大量时间,而不是每次只计算函数的值。 (在我测量的情况下,大约50倍。)
有没有办法保存此功能f
,以便我只需要拨打eval
一次?
PS。请不要在此讨论使用eval
的(联合国)安全性,我知道这一点,但此代码并未转到第三方的任何地方将运行它,也不是我的问题。
答案 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
,但我可以多次更改y
和public 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内联到调用者。取决于您的申请。