예제 #1
0
 def test_bad_counter_during_dealloc(self):
     import _lsprof
     # Must use a file as StringIO doesn't trigger the bug.
     sys.stderr = open(TESTFN, 'w')
     try:
         obj = _lsprof.Profiler(lambda: int)
         obj.enable()
         obj = _lsprof.Profiler(1)
         obj.disable()
     finally:
         sys.stderr = sys.__stderr__
         unlink(TESTFN)
예제 #2
0
    def test_bad_counter_during_dealloc(self):
        # bpo-3895
        import _lsprof

        with support.catch_unraisable_exception() as cm:
            obj = _lsprof.Profiler(lambda: int)
            obj.enable()
            obj = _lsprof.Profiler(1)
            obj.disable()
            obj.clear()

            self.assertEqual(cm.unraisable.exc_type, TypeError)
예제 #3
0
 def test_bad_counter_during_dealloc(self):
     import _lsprof
     orig_stderr = sys.stderr
     try:
         with open(TESTFN, 'w') as file:
             sys.stderr = file
             try:
                 obj = _lsprof.Profiler(lambda : int)
                 obj.enable()
                 obj = _lsprof.Profiler(1)
                 obj.disable()
                 obj.clear()
             finally:
                 sys.stderr = orig_stderr
     finally:
         unlink(TESTFN)
예제 #4
0
    def test_scale_of_result(self):
        import _lsprof, time
        prof = _lsprof.Profiler()

        def foo(n):
            t = time.time()
            while abs(t - time.time()) < 1.0:
                pass  # busy-wait for 1 second

        def bar(n):
            foo(n)

        prof.enable()
        bar(0)
        prof.disable()
        stats = prof.getstats()
        entries = {}
        for entry in stats:
            entries[entry.code] = entry
        efoo = entries[foo.func_code]
        ebar = entries[bar.func_code]
        assert 0.9 < efoo.totaltime < 2.9
        # --- cannot test .inlinetime, because it does not include
        # --- the time spent doing the call to time.time()
        #assert 0.9 < efoo.inlinetime < 2.9
        for subentry in ebar.calls:
            assert 0.9 < subentry.totaltime < 2.9
예제 #5
0
 def test_builtins_callers(self):
     import _lsprof
     prof = _lsprof.Profiler(subcalls=True)
     lst = []
     def f1():
         lst.append(len(lst))
     prof.enable(subcalls=True)
     f1()
     prof.disable()
     stats = prof.getstats()
     expected = (
         "<len>",
         "<method 'append' of 'list' objects>",
     )
     by_id = set()
     for entry in stats:
         if entry.code == f1.__code__:
             assert len(entry.calls) == 2
             for subentry in entry.calls:
                 assert subentry.code in expected
                 by_id.add(id(subentry.code))
         elif entry.code in expected:
             by_id.add(id(entry.code))
     #  :-(  cProfile.py relies on the id() of the strings...
     assert len(by_id) == len(expected)
예제 #6
0
 def main(n):
     import _lsprof
     prof = _lsprof.Profiler()
     i = 0
     lst = []
     prof.enable()
     while i < n:
         lst.append(i)  # ID: append
         lst.pop()  # ID: pop
         i += 1
     prof.disable()
     return [(entry.code, entry.callcount) for entry in prof.getstats()]
예제 #7
0
    def test_builtin_exception(self):
        import math
        import _lsprof

        prof = _lsprof.Profiler()
        prof.enable()
        try:
            math.sqrt("a")
        except TypeError:
            pass
        prof.disable()
        stats = prof.getstats()
        assert len(stats) == 2
예제 #8
0
 def test_builtins(self):
     import _lsprof
     prof = _lsprof.Profiler()
     lst = []
     prof.enable()
     lst.append(len(lst))
     prof.disable()
     stats = prof.getstats()
     expected = (
         "<len>",
         "<method 'append' of 'list' objects>",
         "<method 'disable' of '_lsprof.Profiler' objects>",
     )
     for entry in stats:
         assert entry.code in expected
예제 #9
0
    def test_direct(self):
        import _lsprof

        def getticks():
            return len(ticks)

        prof = _lsprof.Profiler(getticks, 0.25, True, False)
        ticks = []

        def bar(m):
            ticks.append(1)
            if m == 1:
                foo(42)
            ticks.append(1)

        def spam(m):
            bar(m)

        def foo(n):
            bar(n)
            ticks.append(1)
            bar(n + 1)
            ticks.append(1)
            spam(n + 2)

        prof.enable()
        foo(0)
        prof.disable()
        assert len(ticks) == 16
        stats = prof.getstats()
        entries = {}
        for entry in stats:
            if not hasattr(entry.code, 'co_name'):
                print entry.code
            else:
                entries[entry.code.co_name] = entry
        efoo = entries['foo']
        assert efoo.callcount == 2
        assert efoo.reccallcount == 1
        assert efoo.inlinetime == 1.0
        assert efoo.totaltime == 4.0
        assert len(efoo.calls) == 2
        ebar = entries['bar']
        assert ebar.callcount == 6
        assert ebar.reccallcount == 3
        assert ebar.inlinetime == 3.0
        assert ebar.totaltime == 3.5
        assert len(ebar.calls) == 1
        espam = entries['spam']
        assert espam.callcount == 2
        assert espam.reccallcount == 0
        assert espam.inlinetime == 0.0
        assert espam.totaltime == 1.0
        assert len(espam.calls) == 1

        foo2spam, foo2bar = efoo.calls
        if foo2bar.code.co_name == 'spam':
            foo2bar, foo2spam = foo2spam, foo2bar
        assert foo2bar.code.co_name == 'bar'
        assert foo2bar.callcount == 4
        assert foo2bar.reccallcount == 2
        assert foo2bar.inlinetime == 2.0
        assert foo2bar.totaltime == 3.0
        assert foo2spam.code.co_name == 'spam'
        assert foo2spam.callcount == 2
        assert foo2spam.reccallcount == 0
        assert foo2spam.inlinetime == 0.0
        assert foo2spam.totaltime == 1.0

        bar2foo, = ebar.calls
        assert bar2foo.code.co_name == 'foo'
        assert bar2foo.callcount == 1
        assert bar2foo.reccallcount == 0
        assert bar2foo.inlinetime == 0.5
        assert bar2foo.totaltime == 2.0

        spam2bar, = espam.calls
        assert spam2bar.code.co_name == 'bar'
        assert spam2bar.callcount == 2
        assert spam2bar.reccallcount == 0
        assert spam2bar.inlinetime == 1.0
        assert spam2bar.totaltime == 1.0
예제 #10
0
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@author: Alfons
@contact: [email protected]
@file: profile_lsprof.py
@time: 2020/4/19 上午10:30
@version: v1.0 
"""
import _lsprof
from test_func import fib_seq

profile = _lsprof.Profiler()
profile.enable()
fib_seq(30)
profile.disable()

res = profile.getstats()
print "\n".join([str(r) for r in res])