def test_on_function(self):
        @do_cprofile
        def expensive_function():
            for x in _get_number():
                i = x**3
            return i

        with capture_stdout_and_stderr() as out:
            expensive_function()
        results = _extract_do_cprofile_results(out[0])
        print(results)
        msg = str(results)
        assert len(results), msg
        assert results[0][5].startswith('function calls in')
        assert results[0][0] > 50000
        assert results[
            1] == 'ncalls  tottime  percall  cumtime  percall filename:lineno(function)'
        num_tests = 0
        for result in results[2:]:
            if result[5].endswith('(expensive_function)'):
                num_tests += 1
                for i in range(5):
                    assert result[i] > 0
            elif result[5].endswith('(_get_number)'):
                num_tests += 1
        if num_tests != 2:
            raise ValueError('Did not find _get_number or expensive_function')
    def test_on_class_method_and_follow_class_method(self):
        class ExpensiveClass2(object):
            n = 5000
            """You can not put class method _get_number2 directly into follow
            instead you must pass its name as a string:
            """
            @do_profile(follow=['_get_number2'])
            def expensive_method2(self):
                for x in self._get_number2():
                    i = x**4
                return i

            def _get_number2(self):
                for x in range(self.n):
                    yield x

        with capture_stdout_and_stderr() as out:
            ExpensiveClass2().expensive_method2()
        results = _extract_do_profile_results(out[0])
        print(results)
        msg = str(results)
        assert len(results) > 0, msg
        assert results[0] == FIRST_LINE, msg
        assert results[1][5].strip(
        ) == "@do_profile(follow=['_get_number2'])", msg
        assert results[2][5].strip() == 'def expensive_method2(self):', msg
        assert results[2][1] == 0, msg
        assert results[2][2] == 0, msg
        assert results[6] == FIRST_LINE, msg
        assert results[7][5].strip() == 'def _get_number2(self):', msg
Example #3
0
    def test_on_all_class_methods(self):
        class ExpensiveClass3(object):
            n = 5000
            n2 = 50
            """Profile all methods of ExpensiveClass3"""
            @do_profile(follow_all_methods=True)
            def expensive_method3(self):
                for x in self._get_number3():
                    for y in self._get_number32():
                        i = x ^ 9
                return i

            def _get_number3(self):
                for x in range(self.n):
                    yield x

            def _get_number32(self):
                for x in range(self.n2):
                    yield x

        with capture_stdout_and_stderr() as out:
            _test3 = ExpensiveClass3().expensive_method3()
        results = _extract_do_profile_results(out[0])
        self.assertEqual(results[0], FIRST_LINE)
        self.assertEqual(results[1][5].strip(),
                         '@do_profile(follow_all_methods=True)')
        self.assertEqual(results[2][5].strip(), 'def expensive_method3(self):')
        self.assertEqual(results[2][1], 0)
        self.assertEqual(results[2][2], 0)
        self.assertEqual(results[7], FIRST_LINE)
        self.assertEqual(results[8][5].strip(), 'def _get_number3(self):')
    def test_on_all_class_methods(self):
        class ExpensiveClass3(object):
            n = 5000
            n2 = 50
            """Profile all methods of ExpensiveClass3"""
            @do_profile(follow_all_methods=True)
            def expensive_method3(self):
                for x in self._get_number3():
                    for y in self._get_number32():
                        i = x ^ 9
                return i

            def _get_number3(self):
                for x in range(self.n):
                    yield x

            def _get_number32(self):
                for x in range(self.n2):
                    yield x

        with capture_stdout_and_stderr() as out:
            ExpensiveClass3().expensive_method3()
        results = _extract_do_profile_results(out[0])
        msg = str(results)
        assert len(results) > 0, msg
        assert results[0] == FIRST_LINE
        assert results[1][5].strip() == '@do_profile(follow_all_methods=True)'
        assert results[2][5].strip() == 'def expensive_method3(self):'
        assert results[2][1] == 0
        assert results[2][2] == 0
        assert results[7] == FIRST_LINE
        assert results[8][5].strip() == 'def _get_number3(self):'
Example #5
0
    def test_on_class_method_and_follow_class_method(self):
        class ExpensiveClass2(object):
            n = 5000
            """You can not put class method _get_number2 directly into follow
            instead you must pass its name as a string:
            """
            @do_profile(follow=['_get_number2'])
            def expensive_method2(self):
                for x in self._get_number2():
                    i = x**4
                return i

            def _get_number2(self):
                for x in range(self.n):
                    yield x

        with capture_stdout_and_stderr() as out:
            _test2 = ExpensiveClass2().expensive_method2()
        results = _extract_do_profile_results(out[0])
        print(results)
        self.assertEqual(results[0], FIRST_LINE)
        self.assertEqual(results[1][5].strip(),
                         "@do_profile(follow=['_get_number2'])")
        self.assertEqual(results[2][5].strip(), 'def expensive_method2(self):')
        self.assertEqual(results[2][1], 0)
        self.assertEqual(results[2][2], 0)
        self.assertEqual(results[6], FIRST_LINE)
        self.assertEqual(results[7][5].strip(), 'def _get_number2(self):')
 def test_direct_on_function(self):
     with capture_stdout_and_stderr() as out:
         timefun(_expensive_function)()
     msg = str(out)
     # print(out)
     assert len(out), msg
     assert out[0].startswith('@timefun:_expensive_function took'), msg
     time = float(out[0].split('took')[1].strip().split(' ')[0])
     assert time > 0
    def test_direct_timing(self):

        # or directly
        with capture_stdout_and_stderr() as out:
            timer = TimeWith('fancy thing')
            _expensive_function()
            timer.checkpoint('done with something')

        msg = str(out)
        # print(out)
        assert len(out), msg
        assert out[0].startswith('fancy thing done with something took'), msg
Example #8
0
    def test_on_function(self):
        @timefun
        def expensive_function():
            for x in _get_number():
                i = x**3
            return i

        with capture_stdout_and_stderr() as out:
            _test0 = expensive_function()
        print(out[0])
        self.assertTrue(out[0].startswith('@timefun:expensive_function took'))
        time = float(out[0].split('took')[1].strip().split(' ')[0])
        self.assertTrue(time > 0)
    def test_decorate_function(self):
        @timefun
        def expensive_function():
            for x in _get_number():
                i = x**3
            return i

        with capture_stdout_and_stderr() as out:
            expensive_function()
        msg = str(out)
        # print(out)
        assert len(out), msg
        assert out[0].startswith('@timefun:expensive_function took'), msg
        time = float(out[0].split('took')[1].strip().split(' ')[0])
        assert time > 0
 def test_on_all_class_methods_without_decorator(self):
     with capture_stdout_and_stderr() as out:
         cls = ExpensiveClass4()
         do_profile(follow=[cls._get_number4])(cls.expensive_method4)()
     results = _extract_do_profile_results(out[0])
     print(results)
     msg = str(results)
     assert len(results) > 0, msg
     assert results[0] == FIRST_LINE, msg
     assert results[1][5].strip() == 'def expensive_method4(self):', msg
     assert results[2][5].strip() == 'for x in self._get_number4():', msg
     assert results[2][1] == 5001, msg
     assert results[2][2] > 10, msg
     assert results[5] == FIRST_LINE, msg
     assert results[6][5].strip() == 'def _get_number4(self):', msg
Example #11
0
    def test_on_all_class_methods_without_decorator(self):
        with capture_stdout_and_stderr() as out:
            cls = ExpensiveClass4()
            _test4 = do_profile(follow=[cls._get_number4])(
                cls.expensive_method4)()
        results = _extract_do_profile_results(out[0])

        print(results)
        self.assertEqual(results[0], FIRST_LINE)
        self.assertEqual(results[1][5].strip(), 'def expensive_method4(self):')
        self.assertEqual(results[2][5].strip(),
                         'for x in self._get_number4():')
        self.assertEqual(results[2][1], 5001)
        self.assertTrue(results[2][2] > 10)
        self.assertEqual(results[5], FIRST_LINE)
        self.assertEqual(results[6][5].strip(), 'def _get_number4(self):')
Example #12
0
    def test_on_function_and_follow_function(self):
        @do_profile(follow=[_get_number])
        def expensive_function():
            for x in _get_number():
                i = x**3
            return i

        with capture_stdout_and_stderr() as out:
            _test0 = expensive_function()
        results = _extract_do_profile_results(out[0])
        self.assertEqual(results[0], FIRST_LINE)
        self.assertEqual(results[1][5].strip(), 'def _get_number():')
        self.assertEqual(results[2][5].strip(), 'for x in range(50000):')
        self.assertEqual(results[2][1], 50001)
        self.assertTrue(results[2][2] > 4000)
        self.assertEqual(results[4], FIRST_LINE)
        self.assertEqual(results[5][5].strip(),
                         '@do_profile(follow=[_get_number])')
    def test_on_function_and_follow_function(self):
        @do_profile(follow=[_get_number])
        def expensive_function():
            for x in _get_number():
                i = x**3
            return i

        with capture_stdout_and_stderr() as out:
            expensive_function()
        results = _extract_do_profile_results(out[0])
        msg = str(results)
        assert len(results) > 0, msg
        assert results[0] == FIRST_LINE
        assert results[1][5].strip() == 'def _get_number():'
        assert results[2][5].strip() == 'for x in range(50000):'
        assert results[2][1] == 50001
        assert results[2][2] > 4000
        assert results[4] == FIRST_LINE
        assert results[5][5].strip() == '@do_profile(follow=[_get_number])'
Example #14
0
    def test_on_class_method_and_follow_function(self):
        class ExpensiveClass1(object):
            @do_profile(follow=[_get_number])
            def expensive_method1(self):
                for x in _get_number():
                    i = x ^ 6
                return i

        with capture_stdout_and_stderr() as out:
            _test1 = ExpensiveClass1().expensive_method1()
        results = _extract_do_profile_results(out[0])
        print(results)
        self.assertEqual(results[0], FIRST_LINE)
        self.assertEqual(results[1][5].strip(), 'def _get_number():')
        self.assertEqual(results[2][5].strip(), "for x in range(50000):")
        self.assertEqual(results[2][1], 50001)
        self.assertTrue(results[2][2] > 2900)
        self.assertEqual(results[4], FIRST_LINE)
        self.assertEqual(results[5][5].strip(),
                         '@do_profile(follow=[_get_number])')
    def test_timing_with_context_manager(self):
        # prints something like:
        # fancy thing done with something took 0.582462072372 seconds
        # fancy thing done with something else took 1.75355315208 seconds
        # fancy thing finished took 1.7535982132 seconds
        with capture_stdout_and_stderr() as out:
            with TimeWith('fancy thing') as timer:
                _expensive_function()
                timer.checkpoint('done with something')
                _expensive_function()
                _expensive_function()
                timer.checkpoint('done with something else')

        msg = str(out)
        # print(out)
        assert len(out), msg
        out0 = out[0].split('\n')
        assert out0[0].startswith('fancy thing done with something took'), msg
        assert out0[1].startswith(
            'fancy thing done with something else took'), msg
        assert out0[2].startswith('fancy thing finished took'), msg
Example #16
0
    def test_on_function(self):
        @do_cprofile
        def expensive_function():
            for x in _get_number():
                i = x**3
            return i

        with capture_stdout_and_stderr() as out:
            _test0 = expensive_function()
        results = _extract_do_cprofile_results(out[0])
        print(results)
        self.assertTrue(results[0][5].startswith('function calls in'))
        self.assertTrue(results[0][0] > 50000)
        self.assertEqual(
            results[1],
            'ncalls  tottime  percall  cumtime  percall filename:lineno(function)'
        )
        for i in range(5):
            self.assertGreater(results[2][i], 0)
        self.assertEqual(results[2][5],
                         'test_profiletools.py:195(expensive_function)')
        self.assertEqual(results[3][5], 'test_profiletools.py:47(_get_number)')
    def test_on_class_method_and_follow_function(self):
        class ExpensiveClass1(object):
            @do_profile(follow=[_get_number])
            def expensive_method1(self):
                for x in _get_number():
                    i = x ^ 6
                return i

        with capture_stdout_and_stderr() as out:
            ExpensiveClass1().expensive_method1()
        results = _extract_do_profile_results(out[0])
        print(results)
        msg = str(results)
        assert len(results) > 0, msg
        assert results[0] == FIRST_LINE, msg
        assert results[1][5].strip() == 'def _get_number():', msg
        assert results[2][5].strip() == "for x in range(50000):", msg
        assert results[2][1] == 50001, msg
        assert results[2][2] > 2900, msg
        assert results[4] == FIRST_LINE, msg
        assert results[5][5].strip(
        ) == '@do_profile(follow=[_get_number])', msg