我可以在 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_profilerunittest.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()