1

我想这是一个初学者的问题,但我想知道当您遇到使用模块中定义的类中的类方法以及方法的情况时,使用更 Pythonic 的方法在模块本身中定义。我将以 numpy 为例。

import numpy as np

foo = np.matrix([[3, 4], [9, 12]])

# Get norm (without using linalg)
norm = np.sqrt(foo.dot(foo.T)).diagonal()

我可以使用混合大小写,像这样,我调用 foo 的方法和 numpy 中定义的方法,或者我可以编写如下代码:

norm = np.diagonal(np.sqrt(np.dot(foo, foo.T)))

我自己更喜欢使用 foo.bar.baz.shoop.doop 语法,但在这种情况下我不能,因为 sqrt 不是 foo 的方法。那么,写这样一行的更 Pythonic 的方式是什么?

顺便问一下,与模块中定义的方法相比,类方法通常更优化吗?我不太了解幕后发生的事情,但我假设(再次以 numpy 为例)numpy 有一个 np.dot 方法,该方法是为 arg 可以是数组或矩阵的一般情况编写的,而 np.matrix.dot 仅针对矩阵运算重新实现和优化。如果我在这方面错了,请纠正我。

4

1 回答 1

1

你问的问题并没有真正的答案,因为你问的案例根本不存在。

通常,在 Python 中,您没有可用作方法和全局函数的相同函数。

NumPy 是一个特例,因为一些(但不是全部)顶级函数也可用作相应对象的方法。即便如此,它们通常没有相同的语义,所以答案不是风格问题,而是哪个是正确的功能。

例如,在您的情况下,您唯一可以选择的是diagonal. 这两个选项给出了不同的结果。

>>> m = matrix([[1,2,3], [4,5,6], [7,8,9]]
>>> np.diagonal(m)
array([1, 5, 9])
>>> m.diagonal()
matrix([[1, 5, 9]])

模块函数采用形状为 (N, N) 的二维数组并返回形状为 (N,) 的一维数组。该方法采用形状为 (N, N) 的二维矩阵并返回形状为 (1, N) 的二维矩阵。

matrix方法可能会更快。但这并不重要,因为如果其中一个是正确的,另一个是错误的。这就像问两个数字相乘是否+更快*。不管+是不是快*,它都不是一种更快的乘法方式,因为它不会乘法。

于 2013-07-12T01:35:42.133 回答