我有一个大型数组和一个将索引列表返回到数组中的函数,即
import numpy
n = 500
a = numpy.random.rand(n)
def get_idx(k):
# More complicated in reality
return range(n) if k > 6 else range(k)
data = a[get_idx(29)]
data = a[get_idx(30)]
# ...
Run Code Online (Sandbox Code Playgroud)
一个典型的例子是范围是整个数组range(n).不幸的是,a[range(n)]随着n时间的缩放a[:]当然是恒定时间.这是一个不能返回可惜:的get_idx.
我可以返回什么get_idx作为整个数组的索引?
我在解释数据时遇到问题cProfile。为了向您展示我的问题,我创建了这个简单的脚本。
函数 D 调用 B 和 C,它们都调用 A。
函数 A 显然占用了 1 秒(+开销)。
如果我们查看蛇形可视化结果,您会发现报告有点奇怪。我知道函数 A 总共花费了 2 秒,但在函数 C 内,函数 A 只花费了 1 秒,这就是我感兴趣的。有谁知道是否有一个设置(或不同的查看器)在其中我的没有这个问题吗?
import time
import cProfile
def A():
time.sleep(1)
def B():
A()
def C():
A()
def D():
B()
C()
cProfile.run('D()','profileResults.prf')
Run Code Online (Sandbox Code Playgroud)
我有一个用于渲染场景的帧缓冲区,现在我想将其渲染为“全屏”四边形。我如何设置我的相机以及我应该在我的顶点着色器中放入什么以便将帧缓冲区的纹理渲染到整个屏幕。
我试过像这样创建一个全屏四边形
var gl = this.gl;
var quad_vertex_buffer = gl.createBuffer();
var quad_vertex_buffer_data = new Float32Array([
-1.0, -1.0, 0.0,
1.0, -1.0, 0.0,
-1.0, 1.0, 0.0,
-1.0, 1.0, 0.0,
1.0, -1.0, 0.0,
1.0, 1.0, 0.0]);
gl.bufferData(quad_vertex_buffer, quad_vertex_buffer_data, gl.STATIC_DRAW);
gl.bindBuffer(gl.ARRAY_BUFFER, quad_vertex_buffer);
gl.vertexAttribPointer(this.shaderProgram.vertexPositionAttribute, 3, gl.FLOAT, false, 0, 0);
//gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);
gl.drawArrays(gl.TRIANGLES,0, 6);
Run Code Online (Sandbox Code Playgroud)
但它仍然使一切变黑。我可以遵循任何想法或示例/教程?
给定一个未知文件类型的文件,我想用多个处理程序之一打开该文件.如果无法打开文件,则每个处理程序都会引发异常.我想尝试所有这些,如果没有成功,提出异常.
我想出的设计是
filename = 'something.something'
try:
content = open_data_file(filename)
handle_data_content(content)
except IOError:
try:
content = open_sound_file(filename)
handle_sound_content(content)
except IOError:
try:
content = open_image_file(filename)
handle_image_content(content)
except IOError:
...
Run Code Online (Sandbox Code Playgroud)
这种级联似乎不是正确的方法.
有什么建议?
我有一个虚类A的数据val和val2.val由...设置A,但val2应该由子项设置A(基于值val).我想强制每个派生类设置val2.下列
#include<iostream>
class A {
public:
A(): val(1), val2(getVal2())
{};
int val;
int val2;
protected:
virtual int getVal2() = 0;
};
class B: public A {
protected:
virtual int getVal2() { return 2*val; };
};
int main(){
B b;
std::cout << b.val2 << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
并没有因为构造工作A调用一个函数(getVal2),这在当时还没有被定义为:
/tmp/cc7x20z3.o: In function `A::A()':
test9.cpp:(.text._ZN1AC2Ev[_ZN1AC5Ev]+0x1f): undefined reference to …Run Code Online (Sandbox Code Playgroud) 如果SymPy表达式包含符号,我想以编程方式找出.例如,为
import sympy
x = sympy.Symbol('x')
y = sympy.Symbol('y')
a = 4 + x**2 + y
b = 4 + y**2
Run Code Online (Sandbox Code Playgroud)
a包含x和y,b仅包含y.
初始化a时std::map<std::string, boost::any>,该值boost::any确实可以采用任何类型的值,包括std::maps.然而,他们需要首先明确定义,例如,
#include <map>
#include <boost/any.hpp>
int main() {
std::map<std::string, boost::any> a = {{"y", 2}};
std::map<std::string, boost::any> any = {
{"hh", 4},
{"g", a} // alright
};
}
Run Code Online (Sandbox Code Playgroud)
隐含地尝试同样的事情,例如,
#include <map>
#include <boost/any.hpp>
int main() {
std::map<std::string, boost::any> any = {
{"hh", 4},
{"g", {{"y", 2}}} // mööp
};
}
Run Code Online (Sandbox Code Playgroud)
导致编译错误
error: could not convert ‘{{"hh", 4}, {"g", {{"y", 2}}}}’ from ‘<brace-enclosed initializer list>’ to ‘std::map<std::__cxx11::basic_string<char>, boost::any>’
Run Code Online (Sandbox Code Playgroud)
出了什么问题?有没有办法让初始化适合一个语句?
我有一个基类Base和一个派生类D,我想为我自动生成移动构造函数和移动赋值运算符.遵循Zero规则,我将所有内存管理留给编译器,只使用level-2类(没有原始指针,数组等):
#include <iostream>
class Base{
public:
Base(): a_(42) {}
virtual void show() { std::cout << "Base " << a_ << std::endl; }
private:
int a_;
};
class D : Base {
public:
D(): b_(666) {}
void show() { std::cout << "D " << b_ << std::endl; }
private:
int b_;
};
int main() {
Base b;
b.show();
D d;
d.show();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这应该是吧,对吗?
输入C++核心指南:
基类析构函数应该是公共的和虚拟的,或者是受保护的和非虚拟的.
啊,所以我想我必须添加一个析构函数Base.但这将取消自动生成的移动功能!
什么是干净的出路?
我在我的 Debian 机器上安装了 VTK6,它将所有的 CMake 文件放在
$ ls /usr/lib/cmake/vtk-6.3/
[...]
VTKConfig.cmake
vtkModuleAPI.cmake
[...]
Run Code Online (Sandbox Code Playgroud)
当我做
find_package(VTK)
Run Code Online (Sandbox Code Playgroud)
在另一个项目中,一切正常。然而,
include(vtkModuleAPI)
Run Code Online (Sandbox Code Playgroud)
产生错误
include could not find load file:
vtkModuleAPI
Run Code Online (Sandbox Code Playgroud)
我一直认为find_package()和include共享相同的搜索路径,特别是CMAKE_MODULE_PATH. 显然这是不正确的。
注意
SET(CMAKE_MODULE_PATH "/usr/lib/cmake/vtk-6.3")
include(vtkModuleAPI)
Run Code Online (Sandbox Code Playgroud)
确实有效。
另请注意,我使用的是 CMake 3.5,因此不再FindVTK.cmake 像以前那样使用.
什么是默认的搜索路径find_package()和include()?为什么vtkModuleAPI.cmake找不到?
我有一个std::vector的std::any,所有这些都可以通过被印刷<<(例如,仅整型和浮点).我喜欢有类似的东西
#include <experimental/any>
#include <iostream>
#include <vector>
int main() {
std::vector<std::experimental::any> v;
v.push_back(1);
v.push_back(3.14);
for (const auto& a: v) {
std::cout << a << std::endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为std::any不知道<<:
error: no match for ‘operator<<’
Run Code Online (Sandbox Code Playgroud)
到目前为止,我提出的唯一解决方法是将向量项明确地转换为其中可能包含的任何数据类型,例如,
#include <experimental/any>
#include <iostream>
#include <vector>
int main() {
std::vector<std::experimental::any> v;
v.push_back(1);
v.push_back(3.14);
for (const auto& a: v) {
try {
std::cout << std::experimental::any_cast<int>(a) << std::endl;
} catch (const std::experimental::fundamentals_v1::bad_any_cast&)
{}
try {
std::cout …Run Code Online (Sandbox Code Playgroud)