私はいくつかの引数を取る関数を持っています。そのうちの1つは連絡先番号です。関数に提供されたデータは文書を生成するために使用され、あるオプションが選択された場合、その文書はすぐにインラインで返され、他のオプションは連絡先番号を取り、電子メールを生成します。この関数のオリジナルバージョンでは、関数の開始時に連絡先番号が直ちに解析されましたが、その連絡先番号を使用する電子メールが実際に生成される場所であるため、elseブロックに移動しました。時間の半分を使用しなかった場合は新しい変数です。この例は以下の通りです、とDjangoフレームワークを使用してPythonで構築されています:分岐後に関数の引数を使う方が効率的です(Python)?
def function(request, object, number=None):
obj = ObjectItem.objects.get(id=object)
# Originally number processed here
if request.method == 'POST':
if 'inline' in request.POST:
data = {
'object': obj,
}
return generate_document(data, inline=True)
else:
if number:
contact = '{}'.format(number)
else:
contact = obj.contact
data = {
'object': obj,
}
document = generate_document(data, inline=False)
return message(document, contact)
else:
return redirect()
私のコードを見ながら、私はノーインライン対インライン処理の外にデータ辞書の作成を動かすことができることを実現しますPOSTでは、numberの引数の処理をelseブロックに移動すると、処理が実際には時間が節約されるか、より標準的な方法が実行されるかどうかはわかりません。 Pythonはスクリプト言語なので、コンパイルされた言語でそのような宣言を並べ替えるような自動的な最適化はありませんので、私はこれを行う最も効率的な方法を探しています。
これを測定してください! 'timeit'モジュールは参考になるかもしれません:https://docs.python.org/2/library/timeit.html –
"インライン "の場合、' data'を使うことさえしませんが、 'context' 。 'else'では、あなたが使用しない' contact'という変数を作成します。このオブジェクトはかなり小さいので、そのコストは問題ではないようです。重複したコードを取り除こうとすることは問題ですが、私たちに示したコードから、私はそれらの2つのドキュメントが同じであるとは思わないので、あなたは1つの場所にそれを構築すべきではありません。 – tdelaney
@tdelaneyコードの匿名化中に私は明らかにいくつかのビットを見逃しました。どちらの関数も同じドキュメントを生成しますが、その方法は、ドキュメントをインラインで表示するかどうかの引数を受け取ります。これは、更新されたコードで示しています。私の例でエラーを指摘してくれてありがとう、うまくいけば、更新されたコードが理にかなっています。 –