为什么“\u isurl”是一个实例方法而不是numpy“DataSource”的静态方法?

2024-09-30 10:38:21 发布

您现在位置:Python中文网/ 问答频道 /正文

numpy.lib._datasource模块中的DataSource类有一个短实例方法^{},用于测试path是否为净位置。它不会以任何方式使用实例及其成员。
确实(在Python3.3中)可以使用它,而无需实际创建实例:

DataSource._isurl(None,path)

然而,在我看来,这是静态方法(甚至是在任何类之外定义的正则函数)的典型情况。把它写成实例方法有什么好处吗?你知道吗


Tags: 模块path实例方法函数numpynone定义
1条回答
网友
1楼 · 发布于 2024-09-30 10:38:21

我很有信心,这不是出于性能原因:

import sys

if sys.version_info[0] >= 3:
    from urllib.parse import urlparse
else:
    from urlparse import urlparse

class DataSource(object):

    def _isurl(self, path):
        scheme, netloc, upath, uparams, uquery, ufrag = urlparse(path)
        return bool(scheme and netloc)

    @staticmethod
    def _isurl_staticmeth(path):
        scheme, netloc, upath, uparams, uquery, ufrag = urlparse(path)
        return bool(scheme and netloc)

时间安排:

In [1]: ds = DataSource()

In [2]: %timeit ds._isurl_staticmeth('http://www.google.com')
The slowest run took 14.76 times longer than the fastest. This could mean that an intermediate result is being cached 
100000 loops, best of 3: 2.25 µs per loop

In [3]: %timeit ds._isurl('http://www.google.com')
The slowest run took 12.99 times longer than the fastest. This could mean that an intermediate result is being cached 
100000 loops, best of 3: 2.31 µs per loop

实际上,这两种方法产生几乎相同的字节码:

In [4]: import dis

In [5]: dis.dis(ds._isurl)
  9           0 LOAD_GLOBAL              0 (urlparse)
              3 LOAD_FAST                1 (path)
              6 CALL_FUNCTION            1
              9 UNPACK_SEQUENCE          6
             12 STORE_FAST               2 (scheme)
             15 STORE_FAST               3 (netloc)
             18 STORE_FAST               4 (upath)
             21 STORE_FAST               5 (uparams)
             24 STORE_FAST               6 (uquery)
             27 STORE_FAST               7 (ufrag)

 10          30 LOAD_GLOBAL              1 (bool)
             33 LOAD_FAST                2 (scheme)
             36 JUMP_IF_FALSE_OR_POP    42
             39 LOAD_FAST                3 (netloc)
        >>   42 CALL_FUNCTION            1
             45 RETURN_VALUE        

In [6]: dis.dis(ds._isurl_staticmeth)
 14           0 LOAD_GLOBAL              0 (urlparse)
              3 LOAD_FAST                0 (path)
              6 CALL_FUNCTION            1
              9 UNPACK_SEQUENCE          6
             12 STORE_FAST               1 (scheme)
             15 STORE_FAST               2 (netloc)
             18 STORE_FAST               3 (upath)
             21 STORE_FAST               4 (uparams)
             24 STORE_FAST               5 (uquery)
             27 STORE_FAST               6 (ufrag)

 15          30 LOAD_GLOBAL              1 (bool)
             33 LOAD_FAST                1 (scheme)
             36 JUMP_IF_FALSE_OR_POP    42
             39 LOAD_FAST                2 (netloc)
        >>   42 CALL_FUNCTION            1
             45 RETURN_VALUE

不管是哪种方式,_isurl都不太可能在性能危急的情况下使用。你知道吗

我不能代表numpy开发人员说话,但是我想不出为什么不把_isurl作为staticmethod而不是instancemethod的具体原因。如果我是从头开始设计一个类似的类,那么我可能会让它成为一个staticmethod或者只是一个普通的老模块函数。你知道吗

相关问题 更多 >

    热门问题