電子竹林:Blog2

Tech関係、はてなダイアリーから移転済み...

BlenderのPython処理スピードに関する下調べ

概要

BlenderPythonが遅いので速くするヒントを得ようと試したが、あまり意味なかった...

詳細

  • まずは200の立方体を作るプログラムを次のように100回実行して時間の変移を見てみる。
import bpy
import time
def addOps200Time(addOps):
  ''' return sec for 200 times bpy.ops.mesh.primitive_xxx_add '''
  bpy.ops.object.select_all(action='SELECT')   
  bpy.ops.object.delete(True) # delete all
  start = time.time()
  for z in range(0,10,5): # x2
    for y in range(0,40,4): # x10
      for x in range(0,40,4): # x10
        addOps(location=(x,y,z))
  return(time.time()-start)

resultTable = []
for i in range(100):
  resultTable.append(addOps200Time(bpy.ops.mesh.primitive_cube_add))

for t in resultTable:
    print(t)

f:id:zom-1:20191225100901p:plain:w300

  • 結果は、最初の200個は1.5秒だが100回繰り返すと200個で4.1秒と徐々に増加していく。ただし、この繰り返しを続けると全体にさらに遅くなっていく。三回やった結果が次のグラフ。Blender自体を再起動すれば元に戻るようだ。高速化のヒントはイマイチ分からない。

f:id:zom-1:20191225100910p:plain:w300

-(追記) もしやと思って、繰り返しの部分を次のように内包表記にしてみたが、ほとんど変化なかった。bpy.opsの処理自体が遅いってことだろうなあ。

[addOps(location=(x,y,z)) for z in range(0,10,5) for y in range(0,40,4) for x in range(0,40,4)]