在尝试创建新表时,MySQL正在给我一个我无法解释的错误.
CREATE TABLE Products (
id INT NOT NULL,
PRIMARY KEY(id)
);
CREATE TABLE WarehouseMovements (
time DATETIME NOT NULL,
product1 INT NOT NULL,
product2 INT NOT NULL,
FOREIGN KEY WarehouseMovements(product1) REFERENCES Products(id),
FOREIGN KEY WarehouseMovements(product2) REFERENCES Products(id)
);
Run Code Online (Sandbox Code Playgroud)
这失败了ERROR 1061 (42000): Duplicate key name 'WarehouseMovements'.如果我删除外键约束成功,但我想确保product1和product2实际上指向某个地方.
默认引擎是InnoDB.
查询有什么问题?
我想知道在pandas中是否有一种有效的方法:给定一个数据帧,第一行小于给定值是多少?例如,给定:
addr
0 4196656
1 4197034
2 4197075
3 4197082
4 4197134
Run Code Online (Sandbox Code Playgroud)
第一个小于4197080的值是多少?我想这回只是4197075.行A的解决办法是先通过过滤器和4197080然后坐最后一排,但是这看起来就像是一个极其缓慢的O(N)操作(第一建设一个数据帧,然后利用其最后一行),而二进制搜索将采用O(logN).
df.addr[ df.addr < 4197080].tail(1)
Run Code Online (Sandbox Code Playgroud)
我计时,并且创造df.addr[ df.addr < 4197080]或多或少的相同df.addr[ df.addr < 4197080].tail(1),强烈暗示内部它首先构建一个完整的df.
num = np.random.randint(0, 10**8, 10**6)
num.sort()
df = pd.DataFrame({'addr':num})
df = df.set_index('addr', drop=False)
df = df.sort_index()
Run Code Online (Sandbox Code Playgroud)
获得第一个较小的值非常慢:
%timeit df.addr[ df.addr < 57830391].tail(1)
100 loops, best of 3: 7.9 ms per loop
Run Code Online (Sandbox Code Playgroud)
使用lt改进了一点:
%timeit df.lt(57830391)[-1:]
1000 loops, best of 3: 853 µs per loop
Run Code Online (Sandbox Code Playgroud)
但仍远不及二元搜索那么快:
%timeit bisect(num, 57830391, 0, len(num))
100000 loops, best …Run Code Online (Sandbox Code Playgroud) 我正在尝试实现一个接受可变数量的字符串并转发到print函数的函数,该函数需要char指针和size每个字符串交错.
例:
std::string a = "123";
std::string b = "1234";
forward(a, b); // should call doPrint(a.c_str(), a.size(), b.c_str(), b.size())
Run Code Online (Sandbox Code Playgroud)
我认为以下应该是一个正确的实现,但即使它编译行为是非常令我惊讶的.
template <class ...Args>
void forward(const Args & ... args) {
doPrint( (args.c_str(), args.size())...);
}
Run Code Online (Sandbox Code Playgroud)
forward(a, b)打电话doPrint(3, 4),而不是doPrint("123", 3, "1234", 4),就像我写的那样doPrint((args.size())...).c_str()编译器完全忽略调用.
我试过g++,clang并且icc所有产生相同的输出.有什么问题(args.c_str(), args.size())...?
确实,std::make_tuple(args.c_str(), args.size())...按预期工作,但是我要说我不能改变doPrint接受和处理元组.
C++允许将临时绑定绑定到const引用,从而延长其生命周期.我的问题是:如果我通过const-cast来修改对象,那么这个未定义的行为是什么?让我们假设我的新引用不会比原始的const引用更长,所以它总是指向内存中的有效对象.
如果它确实调用了未定义的行为,那为什么呢?对象存在于堆栈中,如果我能读取它为什么我不能修改它?我理解为什么这可能是一个坏主意,因为临时将很快被销毁,但它是无效的C++?在我的测试中,我的程序在修改临时版后运行正常.