GVKun编程网logo

Python-set()如何实现?(python中set()的用法)

6

在这篇文章中,我们将带领您了解Python-set的全貌,包括如何实现?的相关情况。同时,我们还将为您介绍有关CPython是什么?PyPy是什么?Python和这两个东西有什么关系呢?Python的

在这篇文章中,我们将带领您了解Python-set的全貌,包括如何实现?的相关情况。同时,我们还将为您介绍有关CPython是什么?PyPy是什么?Python和这两个东西有什么关系呢?Python的底层使用什么语言实现?学习Python需要学习底层实现吗?、C#字符串的GetHashCode()如何实现?、JSP+Servlet实现在JSP显示excel(不用插件)如何实现?、Python 3中的Python 2 dict_items.sort()的知识,以帮助您更好地理解这个主题。

本文目录一览:

Python-set()如何实现?(python中set()的用法)

Python-set()如何实现?(python中set()的用法)

我见过有人说setpython 中的对象具有O(1)成员资格检查。如何在内部实现它们以允许这样做?它使用哪种数据结构?该实现还有什么其他含义?

这里的每个答案都非常有启发性,但是我只能接受一个答案,因此,我将选择与原始问题最接近的答案。谢谢你的信息!

答案1

小编典典

实际上,CPython的集合被实现为类似于带有伪值的字典(键是集合的成员)的字典,并且进行了一些优化,可以利用这种缺乏值的方式

因此,基本上,a set使用哈希表作为其基础数据结构。这解释了O(1)成员资格检查,因为在哈希表中查找项目平均而言是O(1)操作。

如果你愿意的话,甚至可以浏览CPython源代码来查找集合,根据Achim Domma的说法,这主要是实现中的剪切粘贴dict

CPython是什么?PyPy是什么?Python和这两个东西有什么关系呢?Python的底层使用什么语言实现?学习Python需要学习底层实现吗?

CPython是什么?PyPy是什么?Python和这两个东西有什么关系呢?Python的底层使用什么语言实现?学习Python需要学习底层实现吗?

回复内容:

首先Python是一种语言,因此根据其实现的不同,有Cpython, Jython, Pypy等。
CPython即用C语言实现Python及其解释器(JIT编译器),Jython是用Java语言来实现,Pypy是用Python来实现(准确说是个Python子集)。就好像是英语也分美国、英国、澳大利亚等英语,其语法是想通的,但是类库的实现是不同的。
至于学习Python是否要学习底层实现,这个应该是不必要的,只从应用的角度来说,是没这个必要的。但是如果需要系统的掌握这门语言,那么了解底层实现更有助于了解这门语言的设计思想以及实现限制等方面。 1.CPython是最流行的Python实现
2.PyPy也是一种Python实现,实现的语言是RPython
3.Python:共产主义;CPython:苏联;PyPy:天朝
4.根据不同实现,用C(CPython)\C++(Pyston)\Java(Jython)\C#(IronPython)\Ruby\JS都有,成熟度非常不同
5.有必要。 Python解释器 Python是一门语言,有语法等规范。但是落实到具体实现上,就不一样了。用C实现的叫CPython,也是目前的参考实现。即最新的语言特性都是在这个上面先实现,Linux,OS X等自带的也是这个版本。用.NET实现的叫IronPython,Java的叫Jython,用Python实现的叫PyPy

C#字符串的GetHashCode()如何实现?

C#字符串的GetHashCode()如何实现?

如何解决C#字符串的GetHashCode()如何实现??

遇到类似问题时,请确保获取参考源源代码。除了从反编译器中可以看到的内容之外,还有很多其他功能。选择与您的首选.NET目标相匹配的目标,该方法在版本之间已发生了很大变化。我将在此处重现它的.NET 4.5版本,该版本是从Source.NET 4.5 \ 4.6.0.0 \ net \ clr \ src \ BCL \ System \ String.cs \ 604718 \ String.cs检索的

        public override int GetHashCode() {

#if FEATURE_RANDOMIZED_STRING_HASHING
            if(HashHelpers.s_UseRandomizedStringHashing)
            { 
                return InternalMarvin32HashString(this, this.Length, 0);
            } 
#endif // FEATURE_RANDOMIZED_STRING_HASHING

            unsafe { 
                fixed (char *src = this) {
                    Contract.Assert(src[this.Length] == ''\0'', "src[this.Length] == ''\\0''");
                    Contract.Assert( ((int)src)%4 == 0, "Managed string should start at 4 bytes boundary");

#if WIN32
                    int hash1 = (5381<<16) + 5381; 
#else 
                    int hash1 = 5381;
#endif 
                    int hash2 = hash1;

#if WIN32
                    // 32 bit machines. 
                    int* pint = (int *)src;
                    int len = this.Length; 
                    while (len > 2) 
                    {
                        hash1 = ((hash1 << 5) + hash1 + (hash1 >> 27)) ^ pint[0]; 
                        hash2 = ((hash2 << 5) + hash2 + (hash2 >> 27)) ^ pint[1];
                        pint += 2;
                        len  -= 4;
                    }

                    if (len > 0) 
                    { 
                        hash1 = ((hash1 << 5) + hash1 + (hash1 >> 27)) ^ pint[0];
                    } 
#else
                    int     c;
                    char *s = src;
                    while ((c = s[0]) != 0) { 
                        hash1 = ((hash1 << 5) + hash1) ^ c;
                        c = s[1]; 
                        if (c == 0) 
                            break;
                        hash2 = ((hash2 << 5) + hash2) ^ c; 
                        s += 2;
                    }
#endif
#if DEBUG 
                    // We want to ensure we can change our hash function daily.
                    // This is perfectly fine as long as you don''t persist the 
                    // value from GetHashCode to disk or count on String A 
                    // hashing before string B.  Those are bugs in your code.
                    hash1 ^= ThisAssembly.DailyBuildNumber; 
#endif
                    return hash1 + (hash2 * 1566083941);
                }
            } 
        }

这可能超出了您的讨价还价,我将对代码进行一些注释:

  • if条件编译指令使此代码适应不同的.NET目标。FEATURE_XX标识符在其他地方定义,并在整个.NET源代码中关闭全部功能。当目标是框架的32位版本时定义WIN32,mscorlib.dll的64位版本是单独构建的,并存储在GAC的其他子目录中。

  • s_UseRandomizedStringHashing变量启用哈希算法的安全版本,该版本旨在使程序员摆脱麻烦,因为这样做不明智,例如使用GetHashCode()生成密码或加密之类的哈希。通过app.exe.config文件中的条目启用它
  • 固定 语句保持索引串便宜,避免了常规检查索引进行边界
  • 第一个Assert确保字符串应以零结尾,以允许在循环中进行优化
  • 第二个断言确保将字符串对齐为应为4的倍数的地址,以保持循环性能
  • 手动展开该循环,对于32位版本,每个循环消耗4个字符。强制转换为int *是在int(32位)中存储2个字符(2 x 16位)的一种技巧。循环后的多余语句处理的字符串长度不是4的倍数。请注意,散列中可以包含零终止符,也可以不包含零终止符,长度不等于偶数。它查看字符串中的 所有 字符,并回答您的问题
  • 循环的64位版本以不同的方式完成,由2手动展开。请注意,它以嵌入的零提前终止,因此不会查看所有字符。否则非常不常见。这很奇怪,我只能猜测这与可能很大的字符串有关。但是想不出一个实际的例子
  • 最后的调试代码可确保框架中的任何代码都不依赖哈希代码在运行之间可重现。
  • 哈希算法是相当标准的。值1566083941是一个幻数,是梅森捻线机中常见的素数。

解决方法

我只是好奇,因为我想它将对性能产生影响。是否考虑完整字符串?如果是,则在长字符串上会变慢。如果仅考虑字符串的一部分,则会导致性能下降(例如,如果仅考虑字符串的开头,则当HashSet主要包含相同的字符串时,它将导致性能下降。

JSP+Servlet实现在JSP显示excel(不用插件)如何实现?

JSP+Servlet实现在JSP显示excel(不用插件)如何实现?

最近有个需求,从后台oracle数据库中查询一堆数据,因为这些数据本来就是从excel读出来关键的存在数据库的,现在要提取出来一部分展示在JSP页面上,还是以excel的样式!

需求不能使用grid显示必须是excel,不进行增删改,只显示而已!

我查了一些方法都是需要付费的插件,但是貌似老板没有要付费的意思!所以那些付费的软件就不要推荐了!

大家有什么好的方法给点意见,谢谢大家。

Python 3中的Python 2 dict_items.sort()

Python 3中的Python 2 dict_items.sort()

我正在将一些代码从Python 2移植到3。这是Python 2语法中的有效代码:

def print_sorted_dictionary(dictionary):      items=dictionary.items()      items.sort()

在Python 3中,dict_items没有方法’sort’-如何在Python 3中解决此问题?

答案1

小编典典

使用items = sorted(dictionary.items()),它在Python 2 Python 3中都很好用。

关于Python-set如何实现?的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于CPython是什么?PyPy是什么?Python和这两个东西有什么关系呢?Python的底层使用什么语言实现?学习Python需要学习底层实现吗?、C#字符串的GetHashCode()如何实现?、JSP+Servlet实现在JSP显示excel(不用插件)如何实现?、Python 3中的Python 2 dict_items.sort()的相关知识,请在本站寻找。

本文标签: