[pypy-issue] [issue1584] Pathological case in bridges

Alex Gaynor tracker at bugs.pypy.org
Fri Aug 16 02:58:04 CEST 2013


New submission from Alex Gaynor <alex.gaynor at gmail.com>:

Not sure what causes this yet, playing with the number of iterations PyPy is 
consistenly slower than CPython, I think it's because of the super high number of 
bridges compiled:

Alexanders-MacBook-Pro:tmp alex_gaynor$ PYPYLOG=jit-summary:- pypy 
decision_tree.py
[ac4ea2fa4a5] {jit-summary
Tracing:      	3553	19.518618
Backend:      	3552	2.996290
TOTAL:      		51.207841
ops:             	5654103
recorded ops:    	2932390
  calls:         	95188
guards:          	663823
opt ops:         	599629
opt guards:      	176790
forcings:        	3622
abort: trace too long:	1
abort: compiling:	0
abort: vable escape:	0
abort: bad loop: 	0
abort: force quasi-immut:	0
nvirtuals:       	3885619
nvholes:         	518637
nvreused:        	2282863
Total # of loops:	21
Total # of bridges:	3533
Freed # of loops:	7
Freed # of bridges:	3
[ac4ea6187bd] jit-summary}
Alexanders-MacBook-Pro:tmp alex_gaynor$ cat decision_tree.py
import random

class Node(object):
    def __init__(self, idx, thresh, left, right):
      self.idx = idx
      self.thresh = thresh
      self.left = left
      self.right = right

    def predict(self, x):
      if x[self.idx] < self.thresh:
          return self.left.predict(x)
      else:
          return self.right.predict(x)

    def __eq__(self, other):
        return other.__class__ is Node and \
               self.idx == other.idx and \
               self.thresh == other.thresh and \
               self.left == other.left and \
               self.right == other.right

class Leaf(object):
    def __init__(self, value):
        self.value = value

    def predict(self, x):
        return self.value

    def __eq__(self, other):
        return other.__class__ is Leaf and \
               other.value == self.value


def gen_random_tree(n_features, depth):
  #print "n_features = %d, depth = %d" % (n_features, depth)
  if depth == 0:
      return Leaf(random.random())
  else:
    feature_idx = random.randint(0, n_features-1)
    threshold = random.random()
    left = gen_random_tree(n_features, depth - 1)
    right = gen_random_tree(n_features, depth - 1)
    return Node(feature_idx, threshold, left, right)


def predict_labels(feature_list, tree):
  return [tree.predict(v) for v in feature_list]

def gen_random_tuples(n_items, n_features):
  return [tuple([random.random() for _ in range(n_features)])
          for _ in range(n_items)]


if __name__ == '__main__':
  n_samples = 25000
  n_features = 10
  for i in xrange(100):
    tree = gen_random_tree(n_features, depth = 12)
    features = gen_random_tuples(n_samples, n_features)
    predict_labels(features, tree)

----------
messages: 6070
nosy: agaynor, pypy-issue
priority: performance bug
status: unread
title: Pathological case in bridges

________________________________________
PyPy bug tracker <tracker at bugs.pypy.org>
<https://bugs.pypy.org/issue1584>
________________________________________


More information about the pypy-issue mailing list