当前位置: 首页 > 面试题库 >

等效于内联函数或宏的Python

龚威
2023-03-14
问题内容

我只是意识到

x.real*x.real+x.imag*x.imag

比做的快三倍

abs(x)**2

其中x是一个复数的numpy数组。为了提高代码的可读性,我可以定义一个类似

def abs2(x):
    return x.real*x.real+x.imag*x.imag

仍然比abs(x)** 2快得多,但这是以函数调用为代价的。是否可以像在C中使用宏或使用inline关键字那样内联这样的函数?


问题答案:

是否可以像在C中使用宏或使用inline关键字那样内联这样的函数?

不会。在到达此特定说明之前,Python解释器甚至不知道是否存在这样的函数,更不用说它做了什么。

如评论中所述,PyPy 将自动内联
(上面仍然成立-它“简单地”在运行时生成优化的版本,从中受益,但在无效时中断它),尽管在这种情况下这无济于事因为在PyPy上实施NumPy只是在不久前才开始,直到今天还不是beta版。但最重要的是:不要担心在Python上进行此级别的优化。实现本身可以对其进行优化,也可以不进行优化,这不是您的责任。



 类似资料:
  • 在我的代码中,我使用了预处理器宏 但后来我意识到我需要一个内联函数,并最终得到了以下代码 它有效吗?这似乎有效,但不会造成任何潜在问题吗?

  • 问题 你想为 sort() 操作创建一个很短的回调函数,但又不想用 def 去写一个单行函数, 而是希望通过某个快捷方式以内联方式来创建这个函数。 解决方案 当一些函数很简单,仅仅只是计算一个表达式的值的时候,就可以使用lambda表达式来代替了。比如: >>> add = lambda x, y: x + y >>> add(2,3) 5 >>> add('hello', 'world') 'h

  • 问题内容: 在C / Objective- C中,可以使用MIN和MAX宏在两个数字之间找到最小值和最大值。Swift不支持宏,并且语言/基本库中似乎没有等效项。如果一个去同一个定制的解决方案,也许基于这样的泛型一个? 问题答案: 并且已经在Swift中定义: 请参阅有关Swift中已记录和未记录的内置函数的精彩文章。

  • 函数是一个可以重复使用的代码块,CPU 会一条一条地挨着执行其中的代码。CPU 在执行主调函数代码时如果遇到了被调函数,主调函数就会暂停,CPU 转而执行被调函数的代码;被调函数执行完毕后再返回到主调函数,主调函数根据刚才的状态继续往下执行。 一个 C/ C++ 程序的执行过程可以认为是多个函数之间的相互调用过程,它们形成了一个或简单或复杂的调用链条,这个链条的起点是 main(),终点也是 ma

  • 从软件工程角度看,将程序实现为一组函数很有好处,但函数调用却会增加执行时的开销。 C++ 提供了内联函数 (inline function) 可以减少函数调用的开销,特别是对于小函数。函数定义中函数返回类型前面的限定符inline指示编译器将函数代码复制到程序中以避免函数调用。其代价是会产生函数代码的多个副本并分别插入到程序中每一个调用该函数的位置上(从而使程序更大),而不是只有一个函数副本(每次

  • FAQs in section [9]: [9.1] 内联函数有什么用? [9.2] 有没有个简单的例子说明什么是顺序集成(procedure integration)? [9.3] 内联函数能改善性能么? [9.4] 内联函数如何在安全和速度上取得折衷? [9.5] 为什么我应该用内联函数?而不是原来清晰的 #define 宏? [9.6] 如何告诉编译器使非成员函数成为内联函数? [9.7]