我在项目中使用带有wordnet的NLTK.我在我的PC上手动安装,使用pip:
pip3 install nltk --user在终端中,然后nltk.download()在python shell中下载wordnet.
我想用setup.py文件来创建它们,但我不知道安装wordnet的好方法.
目前,我在调用之后有这段代码setup.py("nltk"在setup调用列表中"nltk"):
import sys
if 'install' in sys.argv:
import nltk
nltk.download("wordnet")
Run Code Online (Sandbox Code Playgroud)
有一个更好的方法吗?
我的代码的瓶颈目前是使用ctypes从Python列表转换为C数组,如本问题所述.
一个小实验表明,与其他Python指令相比,它确实非常慢:
import timeit
setup="from array import array; import ctypes; t = [i for i in range(1000000)];"
print(timeit.timeit(stmt='(ctypes.c_uint32 * len(t))(*t)',setup=setup,number=10))
print(timeit.timeit(stmt='array("I",t)',setup=setup,number=10))
print(timeit.timeit(stmt='set(t)',setup=setup,number=10))
Run Code Online (Sandbox Code Playgroud)
得到:
1.790962941000089
0.0911122129996329
0.3200237319997541
Run Code Online (Sandbox Code Playgroud)
我用CPython 3.4.2获得了这些结果.我和CPython 2.7.9和Pypy 2.4.0的时间相似.
我尝试运行上面的代码perf,注释timeit指令一次只运行一个.我得到这些结果:
ctypes的
Performance counter stats for 'python3 perf.py':
1807,891637 task-clock (msec) # 1,000 CPUs utilized
8 context-switches # 0,004 K/sec
0 cpu-migrations # 0,000 K/sec
59 523 page-faults # 0,033 M/sec
5 755 704 178 cycles # 3,184 GHz
13 552 506 138 instructions …Run Code Online (Sandbox Code Playgroud) 我正在学习C++,并试图编写好的代码.我目前正在使用lof的编译器标志,例如
-Wextra -Wall -pedantic -Werror -Wfatal-errors -Wcast-qual -Wcast-align -Wconversion -Wdouble-promotion -Wfloat-equal -Wshadow -Wpointer-arith -Weffc++ -ansi -Wstrict-aliasing
我刚刚学会了关键字new,delete不应再在C++ 11中使用了.但是,我使用它时没有任何警告.
是否有一些标志用于确保良好的C++ 11风格?
代码合并包括将整个源代码复制到一个文件中。
例如,它是由SQLite完成的,以减少编译时间并提高生成的可执行文件的性能。在这里,它会生成一个包含 184K 行代码的文件。
我的问题不是关于编译时间(已经在这个问题中回答),而是关于可执行文件的效率。
SQLite 开发人员说:
除了使 SQLite 更容易合并到其他项目中之外,合并还使其运行速度更快。当代码包含在单个翻译单元中(例如在合并中)时,许多编译器能够对代码进行额外的优化。当我们使用合并来编译 SQLite 而不是单个源文件时,我们测量了 5% 到 10% 的性能改进。这样做的缺点是额外的优化通常采用函数内联的形式,这往往会使生成的二进制图像的大小更大。
据我了解,这是由于过程间优化(IPO),编译器进行的优化。
GCC开发人员也这么说(感谢 @nwp 提供链接):
编译器根据它对程序的了解来执行优化。一次将多个文件编译为单个输出文件模式允许编译器在编译每个文件时使用从所有文件中获得的信息。
但是他们并没有谈论最终的收益。
除了 SQLite 的测量之外,是否有任何测量可以证实或反驳以下说法:使用 gcc 编译时,带有合并的 IPO 比不带合并的IPO 生成更快的可执行文件?
作为一个附带问题,对于此优化,进行代码合并或将所有 .cpp(或 .c)文件#include 到一个文件中是否相同?
我尝试使用g ++(gcc版本4.8.2(Debian 4.8.2-1))编译以下代码,带有-Wall标志(添加-Wextra标志不会改变我的任何内容).
#include <iostream>
using namespace std ;
int main() {
int i ;
cout << i << endl ;
}
Run Code Online (Sandbox Code Playgroud)
它给出了这个警告:
test.cpp: In function ‘int main()’:
test.cpp:7:13: warning: ‘i’ is used uninitialized in this function [-Wuninitialized]
cout << i << endl ;
Run Code Online (Sandbox Code Playgroud)
但是以下代码不会产生任何警告:
#include <iostream>
using namespace std ;
int main() {
for(int i ; i < 10 ; i++) {
cout << i << endl ;
}
}
Run Code Online (Sandbox Code Playgroud)
我做了进一步的测试.
以下产生警告:
#include <iostream>
using …Run Code Online (Sandbox Code Playgroud) 我想对有理矩阵进行操作.我用的是模块numpy和fractions.
这是我的代码:
import numpy as np
from fractions import Fraction
m=np.matrix([[Fraction(1, 6), Fraction(8, 7)], [Fraction(1, 2), Fraction(3, 2)]])
print(np.linalg.det(m))
# Gives -0.321428571429
print(m[0,0]*m[1,1] - m[0,1]*m[1,0])
# Gives -9/28
Run Code Online (Sandbox Code Playgroud)
由于计算行列式只需要用高斯方法进行合理运算,因此有理矩阵的行列式是合理的.
所以我的问题是:为什么numpy会返回一个浮点而不是一个Fraction?我怎样才能得到理性的决定因素?
请注意,此矩阵上的其他操作可提供合理的输出(例如m.trace()).
以下代码定义了一个简单的 Cython 函数(为了方便起见,使用 Ipython magic)。
%load_ext cython
%%cython
def f(float x, float y=2):
return x+y
Run Code Online (Sandbox Code Playgroud)
然后,调用help(f)会给出以下消息:
Help on built-in function f in module _cython_magic_e37eeabbc63d5167217465ba978239fc:
f(...)
Run Code Online (Sandbox Code Playgroud)
f请注意,未显示 的参数。此外,制表符补全对于 ipython 中的参数名称也不起作用(例如键入f(xthen tab)。
如果我在不使用 Cython 的情况下定义此函数:
def g(x, y=2):
return x+y
Run Code Online (Sandbox Code Playgroud)
调用help(g)给出了这个并且制表符完成按预期工作:
Help on function g in module __main__:
g(x, y=2)
Run Code Online (Sandbox Code Playgroud)
有没有办法通过 Cython 函数获得这种行为?我尝试使用def, cdef, cpdef, 有或没有 ipython 魔法,但没有成功。