为什么不存在?
import math
[x for x in dir(math) if 'log' in x]
>>> ['log', 'log10', 'log1p']
Run Code Online (Sandbox Code Playgroud)
我知道我可以做log(x,2),但是log2很常见,所以我有点困惑.
哦,看起来它只在C99中定义,而不是C90,我猜这回答了我的问题.仍然看起来有点傻.
所以让我们说IC/C++代码分配一些内存,并返回一个指向它的指针.
#include <stdlib.h>
#ifdef __cplusplus
extern "C" {
#endif
void Allocate(void **p) {
int N=2048;
*p=malloc(N);
}
#ifdef __cplusplus
}
#endif
Run Code Online (Sandbox Code Playgroud)
我明白,释放这块内存是我的责任.现在假设我将其编译成共享库并使用ctypes从Python调用它,但是没有显式释放该内存.
import ctypes
from ctypes import cdll, Structure, byref
external_lib = cdll.LoadLibrary('libtest.so.1.0')
ptr=ctypes.c_void_p(0)
external_lib.Allocate(ctypes.byref(ptr))
Run Code Online (Sandbox Code Playgroud)
如果我用valgrind运行这个脚本,如果我编译test.cpp没有'-O3'标志,我会得到2048字节的内存泄漏.但是如果我使用'-O3'标志编译它,那么我不会得到内存泄漏.
这不是一个真正的问题 - 我会小心翼翼地明确释放我分配的任何内存.但我很好奇这种行为来自哪里.
我在linux中用以下脚本测试了这个.
g++ -Wall -c -fPIC -fno-common test.cpp -o libtest1.o
g++ -shared -Wl,-soname,libtest1.so.1 -o libtest1.so.1.0 libtest1.o
g++ -O3 -Wall -c -fPIC -fno-common test.cpp -o libtest2.o
g++ -shared -Wl,-soname,libtest2.so.1 -o libtest2.so.1.0 libtest2.o
valgrind python test1.py &> report1
valgrind python test2.py &> report2
Run Code Online (Sandbox Code Playgroud)
具有以下输出 …
我正在做一些统计工作,我有一个(大)随机数集合来计算平均值,我想使用生成器,因为我只需要计算均值,所以我不需要存储数字.
问题是numpy.mean如果你把它传给发电机就会中断.我可以写一个简单的函数来做我想要的,但我想知道是否有一个正确的,内置的方法来做到这一点?
如果我能说"sum(values)/ len(values)"会很好,但是len不适用于genetators,并且总和已经消耗的值.
这是一个例子:
import numpy
def my_mean(values):
n = 0
Sum = 0.0
try:
while True:
Sum += next(values)
n += 1
except StopIteration: pass
return float(Sum)/n
X = [k for k in range(1,7)]
Y = (k for k in range(1,7))
print numpy.mean(X)
print my_mean(Y)
Run Code Online (Sandbox Code Playgroud)
这两个都给出相同,正确,答案,买my_mean不适用于列表,numpy.mean不适用于生成器.
我真的很喜欢使用发电机的想法,但这样的细节似乎破坏了事情.
所以一般来说,如果你有两个函数f,g:X - > Y,并且如果在Y上定义了一些二元运算+,那么f + g的规范定义为函数x - > f(x)+ G(X).
在Mathematica中实现这个的最佳方法是什么?
f[x_] := x^2
g[x_] := 2*x
h = f + g;
h[1]
Run Code Online (Sandbox Code Playgroud)
产量
(f + g)[1]
Run Code Online (Sandbox Code Playgroud)
作为输出
当然,
H = Function[z, f[z] + g[z]];
H[1]
Run Code Online (Sandbox Code Playgroud)
收益率为3.
我在使用英特尔编译器中的lambda函数时遇到问题,特别是以下代码无法编译:
template<typename T>
std::function<T (int)> make_func(T x) {
return [=](int index) -> T
{
return x;
};
}
Run Code Online (Sandbox Code Playgroud)
我得到的错误是
error: namespace "std" has no member "function"
Run Code Online (Sandbox Code Playgroud)
代码在我的Mac上编译并运行良好,(macports gcc version 4.5).错误在起作用,我们使用英特尔编译器版本11.1.它接受lambda函数(使用-std = c ++ 0x选项),例如:
auto lam = [=](int j) -> int {
printf("testing for lambdas: %d\t%d\n", n, j);
return n;
};
int g = lam(7);
Run Code Online (Sandbox Code Playgroud)
工作中安装的gcc版本是4.1.2,所以我猜测标准库已经老了?
/bin/libc.so.6
Run Code Online (Sandbox Code Playgroud)
说这是用gcc 4.1.2编译的2.5版本.
有没有解决的办法?
提前感谢您的帮助
我有一个脚本,让我们说"foo.py",这取决于一些文件,让我们说"dep.par",我会称之为
python foo.py --parameters=dep.par
Run Code Online (Sandbox Code Playgroud)
如果foo.py只写一个输出文件"bar.dat",我会说:
env=Environment()
env.Command("bar.dat", "dep.par", "python foo.py --parameters=dep.par")
Run Code Online (Sandbox Code Playgroud)
但是,我需要foo.py输出多个文件的情况,让我们说"bar1.dat,bar2.dat,...,barN.dat".
我很茫然,任何帮助都会受到赞赏,谢谢.
如果我在C中编写一个包含Python接口的库,那么在Python接口中编写函数的单元测试是否可以?假设Python接口完整,它应该意味着C代码工作.
大多数情况下,我很懒,因为Python单元测试的东西几乎不需要使用.
谢谢, - 快
问候,
我不确定这是不是一个愚蠢的问题.
假设我有3个numpy数组,A1,A2,A3和3个浮点数,c1,c2,c3
我想评估B = A1*c1 + A2*c2 + A3*c3
numpy计算这个例如,
E1 = A1*c1
E2 = A2*c2
E3 = A3*c3
D1 = E1+E2
B = D1+E3
Run Code Online (Sandbox Code Playgroud)
还是比这更聪明?在c ++中,我有一种巧妙的方法来抽象这种操作.
我定义了一系列通用'LC'模板函数,LC用于线性组合,如:
template<class T,class D>
void LC( T & R,
T & L0,D C0,
T & L1,D C1,
T & L2,D C2)
{
R = L0*C0
+L1*C1
+L2*C2;
}
Run Code Online (Sandbox Code Playgroud)
然后将其专门用于各种类型,
例如,对于数组代码看起来像
for (int i=0; i<L0.length; i++)
R.array[i] =
L0.array[i]*C0 +
L1.array[i]*C1 +
L2.array[i]*C2;
Run Code Online (Sandbox Code Playgroud)
从而避免必须创建新的中间阵列.
这可能看起来很乱,但效果确实很好.
我可以在python中做类似的事情,但我不确定它是否是必需的.
提前感谢您的任何见解.-缺口
呃,所以我正在处理解析器等等,而且我将从一个处理文件的东西转到另一个.
我的代码的第一部分的输出是一个字符串列表; 我正在考虑将每个字符串作为文本文件中的一行.
代码的第二部分需要一个文件类型作为输入.
所以我的问题是,是否有一种正确的,pythonic的方式将字符串列表转换为像对象一样的文件?
我可以将我的字符串列表写入文件,然后重新打开该文件,它可以正常工作,但如果没有必要,写入磁盘似乎有点傻.
我相信所有第二部分需要的是在文件上调用'read()',就像对象一样,所以我也可以用read作为方法定义一个新类,它返回一个长字符串,这是所有字符串的串联线串.
谢谢, - 快