小编cfh*_*cfh的帖子

即使他们不使用ES6箭头功能仍然关闭"this"吗?

我试图理解何时this在ES6箭头函数中进行词法绑定的规则.我们先来看看这个:

function Foo(other) {
    other.callback = () => { this.bar(); };

    this.bar = function() {
        console.log('bar called');
    };
}
Run Code Online (Sandbox Code Playgroud)

当我构造a时new Foo(other),在另一个对象上设置回调.回调是一个箭头函数,并且this箭头函数在词法上绑定到Foo实例,因此Foo即使我没有保留对Foo周围的任何其他引用,也不会进行垃圾回收.

如果我这样做会怎么样?

function Foo(other) {
    other.callback = () => { };
}
Run Code Online (Sandbox Code Playgroud)

现在我将回调设置为nop,我从不提及this它.我的问题是:箭头功能是否仍然是词法绑定this,Foo只要活着就保持other活着,或者Foo在这种情况下可能是垃圾收集?

javascript ecmascript-6 arrow-functions

25
推荐指数
1
解决办法
1242
查看次数

矢量化Numpy切片操作

说我有一个Numpy矢量,

A = zeros(100)
Run Code Online (Sandbox Code Playgroud)

然后我通过一个断点列表将它分成子向量,这些断点索引到A例如

breaks = linspace(0, 100, 11, dtype=int)
Run Code Online (Sandbox Code Playgroud)

所以i-th子向量将位于索引breaks[i](包括)和breaks[i+1](不包括)之间.休息时间不一定是等间隔的,这只是一个例子.但是,它们将始终严格增加.

现在我想对这些子向量进行操作.例如,如果我想将i-th子向量的所有元素设置为i,我可能会这样做:

for i in range(len(breaks) - 1):
    A[breaks[i] : breaks[i+1]] = i
Run Code Online (Sandbox Code Playgroud)

或者我可能想要计算子向量意味着:

b = empty(len(breaks) - 1)
for i in range(len(breaks) - 1):
    b = A[breaks[i] : breaks[i+1]].mean()
Run Code Online (Sandbox Code Playgroud)

等等.

如何避免使用for循环而是对这些操作进行矢量化?

python numpy vectorization

5
推荐指数
2
解决办法
1172
查看次数

Node.js 中的同步 pipeline()

在 Node.js 中,我可能有一些可读流instream,并且想要将其写入文件,所以我这样做

instream.pipe(fs.createWriteStream('out.txt'));
Run Code Online (Sandbox Code Playgroud)

然而,这是一个异步操作并立即返回。我知道我可以将处理程序附加到'finish'输出流的事件。但通常,尤其是在简单的脚本中,我宁愿等待直到pipe()完成。

有没有办法让上面的操作同步呢?

javascript node.js

5
推荐指数
0
解决办法
3291
查看次数

从Numba jitted代码调用Cython函数

我知道调用另一个jitted函数的Numba-jitted函数会识别这个并自动使用快速C调用约定而不是通过Python对象层,因此避免了高Python函数调用开销:

import numba

@numba.jit
def foo(x):
    return x**2

@numba.jit
def bar(x):
    return 4 * foo(x)   # this will be a fast function call
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果我从Numba调用Cython函数,是否也是如此.所以假设我有一个Cython模块,foo.pyx:

cpdef double foo(double x):
    return x**2
Run Code Online (Sandbox Code Playgroud)

以及标准的Python模块bar.py:

import numba
import foo

@numba.jit
def bar(x):
    return 4 * foo.foo(x)   # will this be a fast function call?
Run Code Online (Sandbox Code Playgroud)

Numba会自动识别foo.foo为C可调用函数,还是需要通过设置CFFI包装器手动告诉它?

编辑:进一步反思,从Python解释器的角度来看,Cython函数只是标准的"内置"函数.所以这个问题可以更加通用:Numba是否优化对内置函数和方法的调用以绕过Python调用开销?

python cython numba

5
推荐指数
2
解决办法
734
查看次数

如何使用线性插值扩展数组

我想要的是将长度为m的数组扩展为length的数组n (n>m),并线性插入缺失值。

例如,我想这个阵列延伸[1,5,1,7]至长度的阵列7,结果应该是[1,3,5,3,1,5,7],其中粗体数字从线性内插的结果。

有没有简单的方法可以在Python中做到这一点?提前致谢。

python arrays interpolation

1
推荐指数
1
解决办法
1515
查看次数

构造函数采用auto_ptr

我想编写一个带有构造函数的C++类,该构造函数将其auto_ptr作为参数,以便我可以将类实例从auto_ptrs 初始化为另一个实例:

#include <memory>

class A
{
public:
  A() {}
  A(std::auto_ptr<A> other) {}
};

std::auto_ptr<A> create()
{
  return std::auto_ptr<A>(new A());
}

void foo()
{
  A x = create();
  // A y ( create() );    // works
}
Run Code Online (Sandbox Code Playgroud)

使用g++ -c test.cppgcc 4.6 编译此代码会产生以下错误消息:

test.cpp: In function ‘void foo()’:
test.cpp:17:16: error: no matching function for call to ‘std::auto_ptr<A>::auto_ptr(std::auto_ptr<A>)’
test.cpp:17:16: note: candidates are:
/usr/include/c++/4.6/backward/auto_ptr.h:260:7: note: std::auto_ptr<_Tp>::auto_ptr(std::auto_ptr_ref<_Tp>) [with _Tp = A]
/usr/include/c++/4.6/backward/auto_ptr.h:260:7: note:   no known conversion for argument …
Run Code Online (Sandbox Code Playgroud)

c++ initialization auto-ptr

0
推荐指数
1
解决办法
470
查看次数