2016-05-25 29 views
1

これは、プログラムの実行時間に大きな違いをもたらさないため、これは実用的な問題よりも理論的な問題かもしれません。少なくとも私の場合はそうではありません。Python関数で定数を定義する最適な方法

異なる( "自家製")関数をインポートするPythonコードをいくつか受け取っています。 1つの関数(funcと呼ぶ)は、メインスクリプトから5回呼び出されます(メインと呼びます)。

func多くの定数は、関数の始めに定義されています。

import numpy as np 
    def func(x,y,z): 
     c0 = np.array([1,2,3]) 
     c1 = np.array([1,2,3]) 
     c2 = np.array([1,2,3]) 
     c3 = np.array([1,2,3]) 

     #do stuff with variables x,y,z 
     #return stuff 

私が思っていた:たとえば、この関数を呼び出すとき、定数C0があり、...、C3関数が呼び出されるたびに定義された、または時にバイトコードにコンパイルされたときには、「固定」されますメインスクリプトを実行すると、一度だけ定義されます。

+0

FUNC内部の配列を定義する、おそらく非常に大きなパフォーマンスの問題ではなく、意味的に、それはだ場合それらを使って機能するだけで、彼らはそこにとどまるべきだと主張する。しかし、numpyを関数の中にインポートすると、不正に見える... –

答えて

1

はい、彼らはそれぞれの時間を定義している関数である:あなたがそれらを一度だけ初期化され、その後、あなたが呼び出すたびに、あなたはfuncメソッドの外に定義することができfuncでそれを使用したい場合は

と呼ばれる。

のPythonの動的な性質は、コンパイラがそれらを評価する機会を持っていないので、np.arrayの値が「事前に」、関数の定義とそのコール(とbetweeen呼び出し)の間の時間に変更された可能性があることを意味しています。

クロージャに保存すると、それらをグローバルとして導入することなく一度だけ評価されるようにすることができます。

例:

def _func(): 
    c0 = np.array([1,2,3]) 
    c1 = np.array([1,2,3]) 
    c2 = np.array([1,2,3]) 
    c3 = np.array([1,2,3]) 
    def actual_func(x, y, z): 
     # do stuff 
     # return stuff 
    return actual_func 

_func_closure = _func() 

def func(x, y, z): 
    return _func_closure(x, y, z) 

最後の定義は、関数の外にグローバル変数を避けるためだけに存在している - あなたはそれを気にしない場合は同様に動作func = _func()

これはおそらくよりエレガントに書かれていますが、本質的には「間接レベルを追加する」というアイディアを示しています。

免責事項:これはパフォーマンスが優れているかどうかについては全くわかりません。

(あなたはこのような「トリック」に興味があるなら、たくさんのLisp上の任意のまともな本にあります。)

4

c0,c1などの範囲は、func方法に限定されます。だから、関数を呼び出すたびに、これらの変数は初期化されます

import numpy as np 

c0 = np.array([1,2,3]) 
c1 = np.array([1,2,3]) 
c2 = np.array([1,2,3]) 
c3 = np.array([1,2,3]) 

def func(x,y,z): 

    #do stuff with variables x,y,z 
    #return stuff 
+0

ポイントは定数であるということです。関数内の定数の性質を得るための唯一の方法は、それらを関数外に宣言することです。 – Whir

関連する問題