我如何计算Python中的字节码,以便我可以适当地修改sys.setcheckinterval

时间:2008-11-17 05:44:44

标签: python performance multithreading internals

我有一个使用工作队列和线程的端口扫描应用程序。

它使用简单的TCP连接,并花费大量时间等待数据包返回(最多半秒)。因此,线程不需要完全执行(即前半部分发送数据包,上下文切换,执行操作,返回到具有等待网络数据的线程)。

我怀疑我可以通过修改默认值100的sys.setcheckinterval来提高性能(在切换到另一个线程之前,最多可以执行100个字节码)。

但是不知道在一个线程或函数中实际执行了多少字节码我是盲目的,只是猜测值,测试和依赖测试显示出可测量的差异(这很难,因为执行的代码量很小;简单的套接字连接,因此网络抖动可能会影响任何测量,而不是更改sys.setcheckinterval。)

因此,我想知道在某些代码执行中有多少字节码(即函数或执行一个线程的总数),所以我可以更聪明地猜测将sys.setcheckinterval设置为。

3 个答案:

答案 0 :(得分:3)

对于更高级别(方法,类),dis module应该有帮助。

但如果需要更精细的粮食,tracing将是不可避免的。跟踪确实逐行操作,但explained here是深入了解字节码级别的一个很好的黑客。向Ned Batchelder致敬。

答案 1 :(得分:2)

关于这种复杂系统的推理很少会产生正确的答案。测量结果,并使用运行速度最快的设置。如果如你所说,测试不能测量setcheckinterval的各种设置的差异,那么为什么还要改变呢?只有可衡量的差异很有意思。如果您的测试运行时间太短而无法提供有意义的数据,那么请将运行时间设置为更长时间。

答案 2 :(得分:1)

“我怀疑我可以通过修改sys.setcheckinterval来提高性能”

这很少奏效。正确的行为不能取决于时间 - 你无法控制时间。操作系统,硬件,Python的补丁级别或月亮阶段的轻微更改将改变应用程序的行为方式。

select模块是您用来等待I / O的模块。您的应用程序可以构造为一个主循环,为其他线程执行select和queues工作。其他线程正在等待处理请求队列中的条目。