我可以在 python 模块上 运行 line_profiler 吗?
Can I run line_profiler on python module?
我有一个名为 my_module 的模块,其结构如下。
.
└── my_module
├── main.py
└── test.py
在这里,我使用python -m my_module.test,为了运行测试,因为它使用相对导入。
那我怎么才能运行line_profiler,memory_profiler上一个模块呢? (可以是pytest)
以下是我试过的
1st approach
python -m cProfile -m my_module.test # works -> but I want line_profiler
2nd approach
import line_profiler
import unittest
profiler = line_profiler.LineProfiler()
class PageTester(unittest.TestCase):
@profiler
def test_abc(self):
print(1)
if __name__ == "__main__"
unittest.main(module='page.test')
profiler.print_stats() # doesn't print anything
您可以将 line_profiler
与 unittest.TestCase
一起使用。
只需将 print_stats
移动到 TestCase
的 tearDownClass
import unittest
import line_profiler
profiler = line_profiler.LineProfiler()
class PageTester(unittest.TestCase):
@profiler
def test_abc(self):
print("abc")
#profiler.print_stats()
@profiler
def test_def(self):
self.test_abc()
@classmethod
def tearDownClass(cls):
profiler.print_stats()
if __name__ == "__main__":
unittest.main(module='page.test')
输出符合预期:
abc
abc
Timer unit: 1e-06 s
Total time: 1.3e-05 s
File: /root/page/test.py
Function: test_abc at line 10
Line # Hits Time Per Hit % Time Line Contents
==============================================================
10 @profiler
11 def test_abc(self):
12 2 13.0 6.5 100.0 print("abc")
Total time: 9e-06 s
File: /root/page/test.py
Function: test_def at line 15
Line # Hits Time Per Hit % Time Line Contents
==============================================================
15 @profiler
16 def test_def(self):
17 1 9.0 9.0 100.0 self.test_abc()
我有一个名为 my_module 的模块,其结构如下。
.
└── my_module
├── main.py
└── test.py
在这里,我使用python -m my_module.test,为了运行测试,因为它使用相对导入。
那我怎么才能运行line_profiler,memory_profiler上一个模块呢? (可以是pytest)
以下是我试过的
1st approach
python -m cProfile -m my_module.test # works -> but I want line_profiler
2nd approach
import line_profiler
import unittest
profiler = line_profiler.LineProfiler()
class PageTester(unittest.TestCase):
@profiler
def test_abc(self):
print(1)
if __name__ == "__main__"
unittest.main(module='page.test')
profiler.print_stats() # doesn't print anything
您可以将 line_profiler
与 unittest.TestCase
一起使用。
只需将 print_stats
移动到 TestCase
tearDownClass
import unittest
import line_profiler
profiler = line_profiler.LineProfiler()
class PageTester(unittest.TestCase):
@profiler
def test_abc(self):
print("abc")
#profiler.print_stats()
@profiler
def test_def(self):
self.test_abc()
@classmethod
def tearDownClass(cls):
profiler.print_stats()
if __name__ == "__main__":
unittest.main(module='page.test')
输出符合预期:
abc
abc
Timer unit: 1e-06 s
Total time: 1.3e-05 s
File: /root/page/test.py
Function: test_abc at line 10
Line # Hits Time Per Hit % Time Line Contents
==============================================================
10 @profiler
11 def test_abc(self):
12 2 13.0 6.5 100.0 print("abc")
Total time: 9e-06 s
File: /root/page/test.py
Function: test_def at line 15
Line # Hits Time Per Hit % Time Line Contents
==============================================================
15 @profiler
16 def test_def(self):
17 1 9.0 9.0 100.0 self.test_abc()