2016-03-21 4 views
0

私はいくつかの引数を取る関数を持っています。そのうちの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はスクリプト言語なので、コンパイルされた言語でそのような宣言を並べ替えるような自動的な最適化はありませんので、私はこれを行う最も効率的な方法を探しています。

+1

これを測定してください! 'timeit'モジュールは参考になるかもしれません:https://docs.python.org/2/library/timeit.html –

+1

"インライン "の場合、' data'を使うことさえしませんが、 'context' 。 'else'では、あなたが使用しない' contact'という変数を作成します。このオブジェクトはかなり小さいので、そのコストは問題ではないようです。重複したコードを取り除こうとすることは問題ですが、私たちに示したコードから、私はそれらの2つのドキュメントが同じであるとは思わないので、あなたは1つの場所にそれを構築すべきではありません。 – tdelaney

+0

@tdelaneyコードの匿名化中に私は明らかにいくつかのビットを見逃しました。どちらの関数も同じドキュメントを生成しますが、その方法は、ドキュメントをインラインで表示するかどうかの引数を受け取ります。これは、更新されたコードで示しています。私の例でエラーを指摘してくれてありがとう、うまくいけば、更新されたコードが理にかなっています。 –

答えて

1

パフォーマンスの観点からは、ifまたはifの上にdataを作成するかどうかは関係ありません。 Pythonは一度だけその行にヒットし、dictは一度作成されます。しかし、設計上の理由から、ifの上に移動する必要があります。

最初に、は自分自身を繰り返さない - コードの一部を1か所に合理的に実装できる場合は、コードの周りに振りかざしてはいけません。後でdefaultdictが良いと判断した場合は、1か所で変更するだけです。

第2に、配置はインテントを意味します。 ifの上に置くと、あなたはそのデータ構造をどこでも使うつもりであるという声明を出しました。現在のコードでは、読者は同じ質問をするでしょう...なぜそれがifの上にないのですか?ちょっと些細なことだが、コードを読んでも疑問が増えてはならない。

+0

これを読めば、インラインとメッセージの両方の出力が同じデータを持つ文書を生成し、メッセージ番号を配置するので、ifの前にデータ宣言を移動するのが最善の方法です(と私は確信しています)それがこれまで使用される唯一の場所であるため、elseへの解析は良好です。 –

関連する問題