小编Abh*_*jit的帖子

OrderedDict vs defaultdict vs dict

在python的库中,我们现在有两个字典的Python实现,它们dict在本机dict类型之上进行子类化.

Python的拥护者总是倾向于在可能的情况下defaultdict过度使用dict.setdefault.甚至医生引用了这一点This technique is simpler and faster than an equivalent technique using dict.setdefault():

以类似的方式,由于字典不维护顺序,因此在替代使用时,优选使用OrderedDict过度使用dict然后对项目进行排序.

在上述两种情况下,代码肯定更清晰,但代价是性能损失.

在回答和评论基于项目的问题python唯一列表之一时,我偶然发现dict使用defaultdict和时本机的性能损失OrderedDict.对于性能优势dict解决方案而言,数据的大小似乎也并非无关紧要.

我相信There should be one-- and preferably only one --obvious way to do it.,那么首选方式是什么?

python dictionary

38
推荐指数
2
解决办法
3万
查看次数

用make_pair打破C++ 11的变化(_Ty1 && _Val1,const _Ty2&_Val2)

请考虑以下C++程序

#include<map>
#include<iostream>
int main() {
    int a = 5, b = 7;
    auto pair = std::make_pair<int, int>(a,b);
    return 0;
    }
Run Code Online (Sandbox Code Playgroud)

使用VC11和gcc-4.7.2也会出现不同的错误,虽然它似乎是相关的,VC11错误信息更有意义

You cannot bind an lvalue to an rvalue   
Run Code Online (Sandbox Code Playgroud)

我从这次失败中理解的是

  1. VC11和我认为gcc-4.7.2只有一个std :: make_pair实现,make_pair(_Ty1&& _Val1, const _Ty2& _Val2)它只能接受一个右值引用.以前的VC++版本示例VC10有两个版本,一个是接受左值,另一个是右值引用
  2. Rvalue引用不能用于初始化非const引用,即int & a = b * 5无效.
  3. 我本可以用来std::move转换lvaluervalue引用,并且调用将成功.
  4. 由于std::make_pair每个参数都接受两种不同的类型,因此在所有可能的情况下,模板参数解析可以解析参数的类型,并且不需要显式指定类型.

这种情况似乎微不足道,通过删除显式类型规范并将定义定义为,可以轻松解决不兼容问题

auto pair = std::make_pair(a,b);
Run Code Online (Sandbox Code Playgroud)
  • 现在,我的问题是,从库中删除左值实现的驱动因素是什么?
  • 是否有可能知道以类似方式更改的任何其他库函数?
  • 当我需要针对多个编译器(如g ++,CC,aCC,XL C++,其中编译器尚未升级或编译器不支持rvalue引用和/或移动语义)时,如何处理这些情况.

c++ stl g++ visual-c++ c++11

19
推荐指数
2
解决办法
9728
查看次数

优化键列表的字典成员资格的性能

我正在尝试编写一个代码,如果列表中存在任何列表元素,则该代码应返回true.这件作品的表现非常重要.我知道如果我找到第一个搜索命中,我可以循环遍历列表并中断.有没有更快或更多的Pythonic方式比下面给出的?

for x in someList:
     if x in someDict:
           return True
return False
Run Code Online (Sandbox Code Playgroud)

编辑:我正在使用Python 2.7.我的第一个偏好是更快的方法.

python performance dictionary list python-2.7

19
推荐指数
2
解决办法
1544
查看次数

为什么使用return作为函数中的最后一个语句被认为是错误的样式?

我正在阅读Rust文档,并遇到了以下示例和声明

使用return作为函数的最后一行有效,但被认为是糟糕的样式:

fn foo(x: i32) -> i32 {
    if x < 5 { return x; }

    return x + 1;
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以写上面的内容

fn foo(x: i32) -> i32 {
    if x < 5 { return x; }

    x + 1
}
Run Code Online (Sandbox Code Playgroud)

但我更倾向于写前者,因为这更直观.我确实理解函数返回值应该用作表达式,以便后面有效但是为什么不鼓励前者呢?

rust

18
推荐指数
4
解决办法
4482
查看次数

Friend函数无法构造类的唯一指针

我有一个特定的设计策略,我的类的构造函数是私有的,只能由类的朋友构建.在友元函数中,我正在尝试使用std::make_unique但不编译来创建我的类的unique_pointer .我的VC12编译器抱怨

c:\ program files(x86)\ microsoft visual studio 12.0\vc\include\memory(1639):错误C2248:'Spam :: Spam':无法访问类'Spam'中声明的私有成员

编译过程中失败的相关代码如下

#include <memory>
class Spam {
public:
    friend void Foo();

private:
    Spam(int mem) :mem(mem) {}
    int mem;
};
void Foo() {
    std::unique_ptr<Spam> spam = std::make_unique<Spam>(10);
}
Run Code Online (Sandbox Code Playgroud)

为什么我无法编译?

c++ friend unique-ptr c++11

13
推荐指数
3
解决办法
2064
查看次数

在x86机器上移位超过32位的uint64_t整数未定义的行为?

学习困难的方法,我试图在x86机器上左移一个long longuint64_t超过32位0.我依稀记得在32位机器上移动操作符只能在前32位上操作,但不能重新收集源.我想知道是否在x86机器上移动超过32位的uint64_t整数是未定义的行为?

c c++ x86 bit-shift uint64

12
推荐指数
2
解决办法
1万
查看次数

具有Itertools的等效嵌套循环结构

Python的succint语法通过其电池允许详细的代码行以可读的一行表示.请考虑以下示例

====================================================|
for a in range(3):                                  |
    for b in range(3):                              |
        for c in range(3):                          |
            print (a,b,c),                          |
-  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -|
for e in product(range(3), repeat=3):               |
    print e,                                        |
====================================================|
for a in range(3):                                  |
    for b in range(a , 3):                          |
        for c in range(b , 3):                      |
            print (a,b,c),                          |
-  -  -  -  -  -  -  -  -  - …
Run Code Online (Sandbox Code Playgroud)

python foreach python-itertools python-2.7

12
推荐指数
2
解决办法
1610
查看次数

使用64位regsvr32注册32位DLL

考虑以下理解

  1. 32位进程无法加载64位dll,反之亦然.
  2. 对于注册/注销一个DLL regsvr32调用入口点DllRegisterServer/ DllUnregisterServer加载目标DLL到通过其地址空间后LoadLIbrary.
  3. 在64位系统上,存在32位版本的regsvr32 C:\Windows\SysWOW64

但是在我的2008 R2 Box上,我能够通过64位regsvr32注册一个32位的dll.怎么可能?我错过了什么吗?

在此输入图像描述

c++ windows com rpc

12
推荐指数
2
解决办法
3万
查看次数

为什么需要显式的`-lm`编译器选项

可能重复:
gcc:为什么链接数学库需要-lm标志?

一般来说,除了包含头文件之外,为了使用任何数学函数,math.h您必须使用链接器选项-lm进行链接.-l这里将指代用于搜索特定库的链接器选项libm.o.

我的问题是

为什么GCC默认不包含此库?是因为库大量使用数学协处理器,它需要添加额外的代码来初始化浮点初始化(我可能在这里使用错误的术语)?

注意

我刚刚查看了链接http://stackoverflow.com中提到的所有答案.这对我来说没什么意义.归因于三个基本原因

  1. 保证标准库可用.链接其他posix库(如pthread)显然是有意义的,但为什么我们必须为标准库做一个显式链接.即使是历史原因也不是很清楚.
  2. 为什么libm与libc分开?
  3. 为什么我们仍然在最近的gcc编译器中继承这些行为?它有什么简单性?这是我测试的,没有libm和libm.没有libm的那个,我写了我自己的Pow版本

这是一个例子

abhibhat@abhibhat-VirtualBox:~/Projects/GIPL6_2$ ls -1 Test_*|xargs -I{} sh -c "echo {} && echo "-----------------" && cat {}"
Test_withlibm.c
-----------------
#include<stdio.h>
#include<math.h>
int main() {
    int i=20;
    double output1=pow(2.618033988749895,i);
    return 0;
    }
Test_withoutlibm.c
-----------------
#include<stdio.h>
#include<math.h>
double Pow(double _X, int _Y)  {
    double _Z = 1;
    for (; _Y; _X *= _X) {
    if (_Y & 1) _Z *= _X;
    _Y >>= 1;
    } …
Run Code Online (Sandbox Code Playgroud)

c floating-point gcc

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

使用VS2012编译libffi失败并出现致命错误LNK1281:无法生成SAFESEH映像

使用VS11编译libffi会出现以下链接器错误

libffi\libffi-3.0.9\ms\Win32\Debug\ffi.dll : fatal error LNK1281: Unable to generate SAFESEH image.
Run Code Online (Sandbox Code Playgroud)

同一个项目正在使用VS10进行编译,但在使用VS2012进行自动升级后,它开始提供链接器错误

MSDN中的解释过于神秘且缺乏帮助

我可能会重建/SAFESEH:NO,但我不确定其含义.

请告知可能出现的问题.

c++ visual-studio visual-c++ libffi visual-studio-2012

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