在 C++ 中提升权力与 Python
Raising to powers in C++ vs. Python
来自 Python,我注意到 C++ 中的东西往往更复杂一些。一个很好的例子是将数字提升为幂。在Python的数学库中,只需要:
a = a**b
但是,在 C++ 中,我在在线文档中找到了解释,例如......
//float
pow( float base, float exp );
//double
pow( double base, double exp );
//long double
pow( long double base, long double exp );
//float
pow( float base, int iexp );
//double
pow( double base, int iexp );
//long double
pow( long double base, int iexp );
//promoted
pow( Arithmetic1 base, Arithmetic2 exp );
显然,C++ 的创建者这样做肯定有充分的理由,但作为一名新程序员,这些理由让我难以理解。这会给答案带来更大的灵活性吗?就权力而言,我在 C++ 中获得了哪些好处?
python中的数字没有限制。由此产生的一些后果是程序往往会变慢,因为 python 不是静态类型的,并且有更多的开销,因为它不知道一个数字是否在某个范围内。简而言之,以这种方式使用重载函数的主要原因是为了提高速度,并且更容易推断出幕后发生的事情。 Python 提供了很多便利,但有时会变得很难推理。
其次,大多数语言都有一个math.pow功能(例如Java),虽然有点冗长,但我认为它仍然很容易理解。请注意,当您在 C++ 中调用 pow() 时,编译器将确定应该调用哪个 pow(某些数据类型,某些数据类型),无需担心多个定义。
您发现的多个声明是 C++ 具有 静态类型 与 Python 的 动态类型 的结果。在 Python 中,当您对某个值调用函数时,它可以在运行时确定您是对整数、浮点数还是某些更复杂的对象调用它,并采取适当的操作。在 C++ 中,你不能用不同的类型调用同一个函数,所以你必须为你希望支持的所有类型声明一个不同版本的函数。然而,与 C 不同的是,您可以拥有仅参数签名不同的同名函数(正如 Untitled123 指出的那样,这称为 函数重载 )。这实际上使您的生活更轻松,因为您只需调用 pow(a,b)
而不必担心为您想要的类型调用哪个特殊函数(例如 pow_float_int(a,b)
或 pow_float_float(a,b)
),编译器将调用基于参数类型的正确版本。
如您所知,在 C++ 中我们使用函数代替运算符(如 python)
你可以像上面的例子一样使用 pow。此函数有多种使用模式,每次您向其发送不同的变量时,系统都会决定选择哪种模式。 pow( float base, float exp ); 和 pow( double base, double exp ); 不一样,每个都是一个单独的函数
现在,当您转到 Python 时,会出现完全相同的状态。 ** 运算符就像具有不同模式的 C++ 函数。就像the operators in C++
的定义
希望你能理解我的建议
拥有多个函数签名的好处在于 compile-time 优化与 run-time 决策。
在 Python 中,**
操作在 运行 时查看其参数并决定应用什么算法。整数指数与有理指数与任意浮点数无限精度指数与复数指数与其他任何东西。这个决定需要时间。
在 C++ 中,编译器看到 pow(x, y)
,它在编译时知道 x
和 y
的类型,因此它可以选择最匹配的 pow()
.这反过来又允许编译器避免任何类型的 运行 时间决策。根据 headers 的编写方式 and/or 整个程序优化的存在,编译器甚至可以内联调用并避免任何类型的 运行 除了实际计算能力之外的时间开销。
这通常无关紧要。但是,如果您的 pow()
调用处于具有数百万次迭代的紧密循环中,则可能很重要。
来自 Python,我注意到 C++ 中的东西往往更复杂一些。一个很好的例子是将数字提升为幂。在Python的数学库中,只需要:
a = a**b
但是,在 C++ 中,我在在线文档中找到了解释,例如......
//float
pow( float base, float exp );
//double
pow( double base, double exp );
//long double
pow( long double base, long double exp );
//float
pow( float base, int iexp );
//double
pow( double base, int iexp );
//long double
pow( long double base, int iexp );
//promoted
pow( Arithmetic1 base, Arithmetic2 exp );
显然,C++ 的创建者这样做肯定有充分的理由,但作为一名新程序员,这些理由让我难以理解。这会给答案带来更大的灵活性吗?就权力而言,我在 C++ 中获得了哪些好处?
python中的数字没有限制。由此产生的一些后果是程序往往会变慢,因为 python 不是静态类型的,并且有更多的开销,因为它不知道一个数字是否在某个范围内。简而言之,以这种方式使用重载函数的主要原因是为了提高速度,并且更容易推断出幕后发生的事情。 Python 提供了很多便利,但有时会变得很难推理。
其次,大多数语言都有一个math.pow功能(例如Java),虽然有点冗长,但我认为它仍然很容易理解。请注意,当您在 C++ 中调用 pow() 时,编译器将确定应该调用哪个 pow(某些数据类型,某些数据类型),无需担心多个定义。
您发现的多个声明是 C++ 具有 静态类型 与 Python 的 动态类型 的结果。在 Python 中,当您对某个值调用函数时,它可以在运行时确定您是对整数、浮点数还是某些更复杂的对象调用它,并采取适当的操作。在 C++ 中,你不能用不同的类型调用同一个函数,所以你必须为你希望支持的所有类型声明一个不同版本的函数。然而,与 C 不同的是,您可以拥有仅参数签名不同的同名函数(正如 Untitled123 指出的那样,这称为 函数重载 )。这实际上使您的生活更轻松,因为您只需调用 pow(a,b)
而不必担心为您想要的类型调用哪个特殊函数(例如 pow_float_int(a,b)
或 pow_float_float(a,b)
),编译器将调用基于参数类型的正确版本。
如您所知,在 C++ 中我们使用函数代替运算符(如 python)
你可以像上面的例子一样使用 pow。此函数有多种使用模式,每次您向其发送不同的变量时,系统都会决定选择哪种模式。 pow( float base, float exp ); 和 pow( double base, double exp ); 不一样,每个都是一个单独的函数
现在,当您转到 Python 时,会出现完全相同的状态。 ** 运算符就像具有不同模式的 C++ 函数。就像the operators in C++
的定义希望你能理解我的建议
拥有多个函数签名的好处在于 compile-time 优化与 run-time 决策。
在 Python 中,**
操作在 运行 时查看其参数并决定应用什么算法。整数指数与有理指数与任意浮点数无限精度指数与复数指数与其他任何东西。这个决定需要时间。
在 C++ 中,编译器看到 pow(x, y)
,它在编译时知道 x
和 y
的类型,因此它可以选择最匹配的 pow()
.这反过来又允许编译器避免任何类型的 运行 时间决策。根据 headers 的编写方式 and/or 整个程序优化的存在,编译器甚至可以内联调用并避免任何类型的 运行 除了实际计算能力之外的时间开销。
这通常无关紧要。但是,如果您的 pow()
调用处于具有数百万次迭代的紧密循环中,则可能很重要。