MRが楽しい

MRやVRについて学習したことを書き残す

Blender 2.8のPython APIドキュメントを少しずつ読み解く ベストプラクティス その3

本日は Blender2.8 の調査枠です。
今回から Blender 2.8 の Python API ドキュメントを少しずつ読みつつ試していきます。

Blender 2.8 Python API Documentation

以下のページを日本語訳しつつ実際に試して記事を進めていきます。
docs.blender.org
docs.blender.org

今日は「ベストプラクティス」の「コードの時間」までです。
f:id:bluebirdofoz:20191020203102j:plain

ファイルへの文字列の書き込み(Python General)

書き込み用に複数の文字列を1つの文字列に結合する3つの方法を次に示します。
これは多くの文字列の結合を伴うコードにも適用されます。

String 演算 - これは最も遅いオプションです。特にループでデータを書き込む場合は使用しないでください。

>>> file.write(str1 + " " + str2 + " " + str3 + "\n")

String 書式設定 - float および int から文字列データを書き込むときにこれを使用します。

>>> file.write("%s %s %s\n" % (str1, str2, str3))

String join() 関数 - 文字列のリストを結合するために使用します(リストは一時的な場合があります)。
次の例では、文字列は間にスペース「 」で結合されます。

>>> file.write(" ".join([str1, str2, str3, "\n"]))

join() は多くの文字列で最も速く、文字列の書式設定も非常に高速です(データ型の変換に適しています)。

文字列の解析(インポート/エクスポート)

多くのファイル形式はASCIIであるため、文字列を解析/エクスポートする方法によって、スクリプトの実行速度が大きく異なります
文字列をBlenderにインポートするときに、文字列を解析する方法はいくつかあります。

数値の解析

eval(string) よりも float(string) を使用します。
値がintであることがわかっている場合 int(string)、float()はintでも機能しますが、int()で int を読み取る方が高速です。

文字列の開始/終了の確認

キーワードではなく、文字列の先頭をチェックしている場合の一例です。
以下は非効率な例です。
>|python||
>>> if line[0:5] == "vert ": ...
|

以下を利用します。

>>> if line.startswith("vert "):

startswith() は僅かに高速(約5%)であり、スライスの長さが文字列の長さと一致しない可能性があるエラーも回避します。
my_string.endswith("foo_bar") は行末に使用できます。

テキストが大文字か小文字かわからない場合は、lower() または upper() 文字列関数を使用します。

>>> if line.lower().startswith("vert ")
try / exceptを控えめに使用する

try文はエラーチェックコードを書く時間を節約するために有用です。
ただし、毎回例外を設定する必要があるため、try は if よりも大幅に遅いです。
ループ内で実行され、何度も実行されるコードの領域では try を使用しないでください。

try を使用すると、条件がエラーを発生させるかどうかを確認するよりも高速になる場合があるため、実験する価値があります。

値の比較

Pythonには、値を比較する2つの方法があります。a == b と a is b です。
違いとして == はオブジェクト比較関数 __cmp__() を実行するのに対して、is はIDを比較することです。
つまり、両方の変数がメモリ内の同じアイテムを参照していることを示します。

複数の場所から参照されている同じIDをチェックしていることがわかっている場合は、is はより高速です。

コードの時間

スクリプトの開発中にパフォーマンスの変化に気づくのは良いことですが、これはスクリプトでも簡単に行うことができます。

import time
time_start = time.time()

# do something...

print("My Script Finished: %.4f sec" % (time.time() - time_start))

f:id:bluebirdofoz:20191020203117j:plain