何を修正する必要があるかをよりよく理解できるように、Python コードのどの部分が最も遅く実行されているかを判断しようとしています。私は最近、非常に役立つcProfileとgprof2dotを発見しました。私の問題は、コールバックとして使用している関数に関する情報が表示されないことです。これは、実行が非常に遅い可能性があると思われます。この回答から私が理解していることは、cProfile はデフォルトではメイン スレッドでのみ機能するということです。コールバックは別のスレッドを使用すると推測しています。その答えは、スレッド ライブラリを使用している場合に動作させる方法を示していましたが、私の場合は動作させることができませんでした。
これは私のコードがどのように見えるかです:
import rospy
import cv
import cProfile
from numpy import *
from collections import deque
class Bla():
def __init__( self ):
self.image_data = deque()
self.do_some_stuff()
def vis_callback( self, data ):
cv_im = self.bridge.imgmsg_to_cv( data, "mono8" )
im = asarray( cv_im )
self.play_with_data( im )
self.image_data.append( im )
def run( self ):
rospy.init_node( 'bla', anonymous=True )
sub_vis = rospy.Subscriber('navbot/camera/image',Image,self.vis_callback)
while not rospy.is_shutdown():
if len( self.image_data ) > 0:
im = self.image_data.popleft()
self.do_some_things( im )
def main():
bla = Bla()
bla.run()
if __name__ == "__main__":
cProfile.run( 'main()', 'pstats.out' ) # this could go here, or just run python with -m cProfile
#main()
vis_callback 関数で cProfile 情報を取得する方法についてのアイデアはありますか? スクリプト自体を変更するか、またはpython -m cProfile
その他のコマンド ライン メソッドを使用する方がよいでしょうか。
画像の読み取りまたはキューへの追加が遅いと思います。私の直感では、それらをキューに保存するのは恐ろしいことですが、メインスレッドにない場合は動作を拒否するmatplotlibで表示する必要があるため、損傷がどれほどひどいかを正確に確認したいと思いますこの回避策があります