我想在 Javascript 中定义两个函数(或类),它们具有完全相同的函数体,但它们是完全不同的对象。用例是我在主体中有一些通用逻辑,它是多态的(函数可以接受多种类型),但是通过只调用具有单一类型的函数,函数最终会更快,我假设因为 JIT 可以在每种情况下都采取更快乐的快速路径。
一种方法是简单地完全重复函数体:
function func1(x) { /* some body */ }
function func2(x) { /* some body */ }
Run Code Online (Sandbox Code Playgroud)
另一种以较少重复完成相同事情的方法是eval():
function func(x) { /* some body */ }
function factory() { return eval("(" + func.toString() + ")") }
let func1 = factory(), func2 = factory()
Run Code Online (Sandbox Code Playgroud)
eval()当然,缺点是任何其他工具(缩小器、优化器等)都完全出乎意料,并且有可能破坏我的代码,因此这不起作用。
在标准工具链(我使用 Typescript、esbuild 和 Vite)的范围内,是否有任何明智的方法可以做到这一点,而不使用技巧eval()或只是复制粘贴代码?我也有关于类定义的类似问题。
编辑:总结评论中发生的事情:
function factory() { function func() { /* some body …Run Code Online (Sandbox Code Playgroud)在用 Javascript 编写对大型数字数组进行操作的性能敏感代码时(想想线性代数包,对整数或浮点数进行操作),人们总是希望 JIT 尽可能多地提供帮助。大致意思是:
vec.add(x, y)既x和y被包装SMI阵列,或两者打包双阵列。当一个人偏离这些情况时,就会发生突然而剧烈的性能下降。这可能由于各种无害的原因而发生:
myArray.map(x => -x). 这实际上是“最好的”坏情况,因为压缩的 Double 数组仍然非常快。nullor的函数上undefined。这种糟糕的情况很容易避免。vec.add()通过传入太多类型的东西并将其变成超态。如果您想进行“通用编程”,vec.add()则可能会发生这种情况,在您不注意类型的情况下(因此它会看到很多类型进入)以及在您想要获得最大性能的情况下使用(例如,它应该只接收盒装双打)。我的问题更像是一个软问题,关于如何根据上述考虑编写高性能 Javascript 代码,同时仍然保持代码的美观和可读性。一些具体的子问题,以便您知道我想要什么样的答案:
vec.add()调用站点之类的东西内联?A高速使用线性代数包,然后我导入一个B依赖于的包A,但B使用其他类型调用它并对其进行反优化,突然(没有更改我的代码)我的代码运行速度变慢。有没有一种简单的方法可以将 xarray DataArray 转换为 pandas DataFrame,我可以在其中指定将哪些维度转换为索引/列?例如,假设我有一个 DataArray
import xarray as xr
weather = xr.DataArray(
name='weather',
data=[['Sunny', 'Windy'], ['Rainy', 'Foggy']],
dims=['date', 'time'],
coords={
'date': ['Thursday', 'Friday'],
'time': ['Morning', 'Afternoon'],
}
)
Run Code Online (Sandbox Code Playgroud)
结果是:
<xarray.DataArray 'weather' (date: 2, time: 2)>
array([['Sunny', 'Windy'],
['Rainy', 'Foggy']], dtype='<U5')
Coordinates:
* date (date) <U8 'Thursday' 'Friday'
* time (time) <U9 'Morning' 'Afternoon'
Run Code Online (Sandbox Code Playgroud)
假设我现在想将其移动到按日期索引的 pandas DataFrame,其中包含时间列。我可以通过使用.to_dataframe()然后.unstack()在生成的数据帧上来做到这一点:
<xarray.DataArray 'weather' (date: 2, time: 2)>
array([['Sunny', 'Windy'],
['Rainy', 'Foggy']], dtype='<U5')
Coordinates:
* date (date) <U8 'Thursday' 'Friday' …Run Code Online (Sandbox Code Playgroud)