--- pycallgraph/config.py.orig	2013-09-17 08:41:50 UTC
+++ pycallgraph/config.py
@@ -34,7 +34,7 @@ class Config(object):
         self.did_init = True
 
         # Update the defaults with anything from kwargs
-        [setattr(self, k, v) for k, v in kwargs.iteritems()]
+        [setattr(self, k, v) for k, v in kwargs.items()]
 
         self.create_parser()
 
@@ -51,7 +51,7 @@ class Config(object):
             help='OUTPUT_TYPE', dest='output')
         parent_parser = self.create_parent_parser()
 
-        for name, cls in outputters.items():
+        for name, cls in list(outputters.items()):
             cls.add_arguments(subparsers, parent_parser, usage)
 
     def get_output(self):
--- pycallgraph/memory_profiler.py.orig	2013-09-17 08:41:50 UTC
+++ pycallgraph/memory_profiler.py
@@ -345,8 +345,8 @@ def show_results(prof, stream=None, precision=3):
             continue
         all_lines = linecache.getlines(filename)
         sub_lines = inspect.getblock(all_lines[code.co_firstlineno - 1:])
-        linenos = range(code.co_firstlineno, code.co_firstlineno +
-                        len(sub_lines))
+        linenos = list(range(code.co_firstlineno, code.co_firstlineno +
+                        len(sub_lines)))
         lines_normalized = {}
 
         header = template.format('Line #', 'Mem usage', 'Increment',
@@ -417,7 +417,7 @@ def magic_mprun(self, parameter_s=''):
     -r: return the LineProfiler object after it has completed profiling.
     """
     try:
-        from StringIO import StringIO
+        from io import StringIO
     except ImportError: # Python 3.x
         from io import StringIO
 
@@ -459,7 +459,7 @@ def magic_mprun(self, parameter_s=''):
     try:
         import builtins
     except ImportError:  # Python 3x
-        import __builtin__ as builtins
+        import builtins as builtins
 
     if 'profile' in builtins.__dict__:
         had_profile = True
@@ -492,14 +492,14 @@ def magic_mprun(self, parameter_s=''):
         page(output, screen_lines=self.shell.rc.screen_length)
     else:
         page(output)
-    print(message,)
+    print((message,))
 
     text_file = opts.T[0]
     if text_file:
         with open(text_file, 'w') as pfile:
             pfile.write(output)
-        print('\n*** Profile printout saved to text file %s. %s' % (text_file,
-                                                                    message))
+        print(('\n*** Profile printout saved to text file %s. %s' % (text_file,
+                                                                    message)))
 
     return_value = None
     if 'r' in opts:
@@ -564,7 +564,7 @@ def magic_memit(self, line=''):
         mem_usage.extend(tmp)
 
     if mem_usage:
-        print('maximum of %d: %f MB per loop' % (repeat, max(mem_usage)))
+        print(('maximum of %d: %f MB per loop' % (repeat, max(mem_usage))))
     else:
         print('ERROR: could not read memory usage, try with a lower interval or more iterations')
 
@@ -608,11 +608,11 @@ if __name__ == '__main__':
     __file__ = _find_script(args[0])
     try:
         if sys.version_info[0] < 3:
-            import __builtin__
-            __builtin__.__dict__['profile'] = prof
+            import builtins
+            builtins.__dict__['profile'] = prof
             ns = locals()
             ns['profile'] = prof # shadow the profile decorator defined above
-            execfile(__file__, ns, ns)
+            exec(compile(open(__file__, "rb").read(), __file__, 'exec'), ns, ns)
         else:
             import builtins
             builtins.__dict__['profile'] = prof
--- pycallgraph/output/gephi.py.orig	2013-09-17 08:41:50 UTC
+++ pycallgraph/output/gephi.py
@@ -25,7 +25,7 @@ class GephiOutput(Output):
     def generate(self):
         '''Returns a string with the contents of a GDF file.'''
 
-        return u'\n'.join([
+        return '\n'.join([
             self.generate_nodes(),
             self.generate_edges(),
         ]) + '\n'
@@ -33,21 +33,21 @@ class GephiOutput(Output):
     def generate_nodes(self):
         output = []
 
-        fields = u', '.join([
-            u'name VARCHAR',
-            u'label VARCHAR',
-            u'group VARCHAR',
-            u'calls INTEGER',
-            u'time DOUBLE',
-            u'memory_in INTEGER',
-            u'memory_out INTEGER',
-            u'color VARCHAR',
-            u'width DOUBLE',
+        fields = ', '.join([
+            'name VARCHAR',
+            'label VARCHAR',
+            'group VARCHAR',
+            'calls INTEGER',
+            'time DOUBLE',
+            'memory_in INTEGER',
+            'memory_out INTEGER',
+            'color VARCHAR',
+            'width DOUBLE',
         ])
-        output.append(u'nodedef> {}'.format(fields))
+        output.append('nodedef> {}'.format(fields))
 
         for node in self.processor.nodes():
-            fields = u','.join([str(a) for a in [
+            fields = ','.join([str(a) for a in [
                 node.name,
                 node.name,
                 node.group,
@@ -55,7 +55,7 @@ class GephiOutput(Output):
                 node.time.value,
                 node.memory_in.value,
                 node.memory_out.value,
-                u"'{}'".format(self.node_color_func(node).rgb_csv()),
+                "'{}'".format(self.node_color_func(node).rgb_csv()),
                 self.node_size(node),
             ]])
             output.append(fields)
@@ -68,25 +68,25 @@ class GephiOutput(Output):
     def generate_edges(self):
         output = []
 
-        fields = u', '.join([
-            u'node1 VARCHAR',
-            u'node2 VARCHAR',
-            u'label VARCHAR',
-            u'labelvisible VARCHAR',
-            u'directed BOOLEAN',
-            u'color VARCHAR',
-            u'width DOUBLE',
+        fields = ', '.join([
+            'node1 VARCHAR',
+            'node2 VARCHAR',
+            'label VARCHAR',
+            'labelvisible VARCHAR',
+            'directed BOOLEAN',
+            'color VARCHAR',
+            'width DOUBLE',
         ])
-        output.append(u'edgedef> {}'.format(fields))
+        output.append('edgedef> {}'.format(fields))
 
         for edge in self.processor.edges():
-            fields = u','.join([str(a) for a in [
+            fields = ','.join([str(a) for a in [
                 edge.src_func,
                 edge.dst_func,
                 self.edge_label(edge),
                 'true',
                 'true',
-                u"'{}'".format(self.edge_color_func(edge).rgb_csv()),
+                "'{}'".format(self.edge_color_func(edge).rgb_csv()),
                 edge.calls.fraction * 2,
             ]])
             output.append(fields)
--- pycallgraph/output/graphviz.py.orig	2013-09-17 08:41:50 UTC
+++ pycallgraph/output/graphviz.py
@@ -1,5 +1,5 @@
-from __future__ import division
 
+
 import tempfile
 import os
 import textwrap
@@ -148,7 +148,7 @@ class GraphvizOutput(Output):
 
     def attrs_from_dict(self, d):
         output = []
-        for attr, val in d.iteritems():
+        for attr, val in d.items():
             output.append('%s = "%s"' % (attr, val))
         return ', '.join(output)
 
@@ -164,7 +164,7 @@ class GraphvizOutput(Output):
 
     def generate_attributes(self):
         output = []
-        for section, attrs in self.graph_attributes.iteritems():
+        for section, attrs in self.graph_attributes.items():
             output.append('{} [ {} ];'.format(
                 section, self.attrs_from_dict(attrs),
             ))
--- pycallgraph/output/output.py.orig	2013-09-17 10:23:04 UTC
+++ pycallgraph/output/output.py
@@ -16,14 +16,14 @@ class Output(object):
         self.edge_label_func = self.edge_label
 
         # Update the defaults with anything from kwargs
-        [setattr(self, k, v) for k, v in kwargs.iteritems()]
+        [setattr(self, k, v) for k, v in kwargs.items()]
 
     def set_config(self, config):
         '''
         This is a quick hack to move the config variables set in Config into
         the output module config variables.
         '''
-        for k, v in config.__dict__.iteritems():
+        for k, v in config.__dict__.items():
             if hasattr(self, k) and callable(getattr(self, k)):
                 continue
             setattr(self, k, v)
--- pycallgraph/output/pickle.py.orig	2013-09-17 08:41:50 UTC
+++ pycallgraph/output/pickle.py
@@ -1,7 +1,7 @@
 try:
-    import cPickle as pickle
+    import pickle as pickle
 except ImportError:
-    import pickle
+    from . import pickle
 
 from .output import Output
 
--- pycallgraph/output/ubigraph.py.orig	2013-09-17 08:41:50 UTC
+++ pycallgraph/output/ubigraph.py
@@ -1,5 +1,5 @@
 try:
-    from xmlrpclib import Server
+    from xmlrpc.client import Server
 except ImportError:
     from xmlrpc.client import Server
 
--- pycallgraph/tracer.py.orig	2013-09-17 08:41:50 UTC
+++ pycallgraph/tracer.py
@@ -1,5 +1,5 @@
-from __future__ import division
 
+
 import inspect
 import sys
 import os
@@ -8,7 +8,7 @@ from distutils import sysconfig
 from collections import defaultdict
 from threading import Thread
 try:
-    from Queue import Queue, Empty
+    from queue import Queue, Empty
 except ImportError:
     from queue import Queue, Empty
 
@@ -297,7 +297,7 @@ class TraceProcessor(Thread):
         grp = defaultdict(list)
         for node in self.nodes():
             grp[self.group(node.name)].append(node)
-        for g in grp.iteritems():
+        for g in grp.items():
             yield g
 
     def stat_group_from_func(self, func, calls):
@@ -315,14 +315,14 @@ class TraceProcessor(Thread):
         return stat_group
 
     def nodes(self):
-        for func, calls in self.func_count.iteritems():
+        for func, calls in self.func_count.items():
             yield self.stat_group_from_func(func, calls)
 
     def edges(self):
-        for src_func, dests in self.call_dict.iteritems():
+        for src_func, dests in self.call_dict.items():
             if not src_func:
                 continue
-            for dst_func, calls in dests.iteritems():
+            for dst_func, calls in dests.items():
                 edge = self.stat_group_from_func(dst_func, calls)
                 edge.src_func = src_func
                 edge.dst_func = dst_func
--- setup.py.orig	2013-09-17 08:41:50 UTC
+++ setup.py
@@ -42,7 +42,6 @@ setup(
     packages=['pycallgraph', 'pycallgraph.output'],
     scripts=['scripts/pycallgraph'],
     data_files=data_files,
-    use_2to3=True,
 
     # TODO: Update download_url
     download_url =
