class_docstr: A VM object's __call__ method evaluates a Theano program.
  
  The Stack should be considered the reference VM/Linker implementation.
  It can correctly evaluate all graphs and is the easiest to read. The CVM
  is a port of Stack, and should have the same behavior, but run faster.
  The CVM's code is harder to read though.
  
  The other python VMs are maybe not necessary anymore, and don't take
  advantage of lazy computation, though they still produce the correct
  output for lazy nodes.
  
  Parameters
  ----------
  nodes
      A list of nodes in toposort order.
  thunks
      A list of thunks to execute those nodes, in toposort order.
  pre_call_clear
      A list of containers to empty at the beginning of each call.
  
  Attributes
  ----------
  call_counts
      List of integers, one for each thunk. call_count[i] is the number of
      times thunks[i] was called in the course of computations performed by
      call_with_timers().
  call_times
      List of floats, one for each thunk. call_times[i] is the amount of
      runtime spent on thunks[i] in the course of computations performed by
      call_with_timers().
  
  need_update_inputs : bool
      True indicates that Function.__call__ must implement the feedback from
      output storage to input storage. False means it *must not* repeat that
      feedback.
class_docstr_tok: ["A","VM","object","'s","__call__","method","evaluates","a","Theano","program",".","The","Stack","should","be","considered","the","reference","VM\/Linker","implementation",".","It","can","correctly","evaluate","all","graphs","and","is","the","easiest","to","read",".","The","CVM","is","a","port","of","Stack",",","and","should","have","the","same","behavior",",","but","run","faster",".","The","CVM","'s","code","is","harder","to","read","though",".","The","other","python","VMs","are","maybe","not","necessary","anymore",",","and","do","n't","take","advantage","of","lazy","computation",",","though","they","still","produce","the","correct","output","for","lazy","nodes",".","Parameters","--","--","--","--","--","nodes","A","list","of","nodes","in","toposort","order",".","thunks","A","list","of","thunks","to","execute","those","nodes",",","in","toposort","order",".","pre_call_clear","A","list","of","containers","to","empty","at","the","beginning","of","each","call",".","Attributes","--","--","--","--","--","call_counts","List","of","integers",",","one","for","each","thunk",".","call_count","[","i","]","is","the","number","of","times","thunks","[","i","]","was","called","in","the","course","of","computations","performed","by","call_with_timers","(",")",".","call_times","List","of","floats",",","one","for","each","thunk",".","call_times","[","i","]","is","the","amount","of","runtime","spent","on","thunks","[","i","]","in","the","course","of","computations","performed","by","call_with_timers","(",")",".","need_update_inputs",":","bool","True","indicates","that","Function.__call__","must","implement","the","feedback","from","output","storage","to","input","storage",".","False","means","it","*","must","not","*","repeat","that","feedback","."]
docstr: Accumulate into the profile object
docstr_tok: ["Accumulate","into","the","profile","object"]
code: def update_profile(self, profile):
      """
      Accumulate into the profile object
      """
      for node, thunk, t, c in zip(
          self.nodes, self.thunks, self.call_times, self.call_counts
      ):
          profile.apply_time.setdefault(node, 0.0)
          profile.apply_time[node] += t
  
          profile.apply_callcount.setdefault(node, 0)
          profile.apply_callcount[node] += c
  
          profile.apply_cimpl[node] = hasattr(thunk, "cthunk")
  
      if hasattr(self, "variable_shape"):
          profile.variable_shape = self.variable_shape.copy()
          profile.variable_strides = self.variable_strides.copy()
          profile.variable_offset = self.variable_offset.copy()
  
      if hasattr(self, "node_executed_order"):
          profile.node_executed_order = self.node_executed_order[:]
  
      if hasattr(self, "node_cleared_order"):
          profile.node_cleared_order = self.node_cleared_order[:]
  
      if hasattr(self, "dependencies"):
          profile.dependencies = self.dependencies
  
      # clear the timer info out of the buffers
      for i in xrange(len(self.call_times)):
          self.call_times[i] = 0.0
          self.call_counts[i] = 0
  
imports: from __future__ import absolute_import, print_function, division
  from .None import link
  from collections import defaultdict
  import logging
  import sys
  import time
  import warnings
  import platform
  from theano.configparser import config, _config_var_list
  import theano.gof.cmodule
  from six import iteritems, itervalues
  from six.moves import xrange
label_desc: Use image node_id 4 for calling the VM obj's underlying member method code with example usage: obj.update_profile(profile) without return types