首页 文章 精选 留言 我的

精选列表

搜索[速度],共10000篇文章
优秀的个人博客,低调大师

使用python的pandas读取数据库中数据,初始化到dataframe的速度过慢问题解决思路

原生方法 100万数据,在oracle数据库中,使用最方便的pandas自带的read_sql方法 import pandas as pd import sqlalchemy as sql db_engine=sql.create_engine('oracle://test01:test01@test001db') db_df1=pd.read_sql('select * from my_table1',db_engine) 代码是方便了,不过用了快10分钟,dataframe才初始化完成 通过JDBC查询的方式 import pandas as pd import sqlalchemy as sql db_engine=sql.create_engine('oracle://test01:test01@test001db') conn=ora_engine.raw_connection() cursor=conn.cursor() queryset=cursor.execute('select * from my_table1') columns=[for i[0] in queryset.description] jdbc_data=queryset.fetchall() db_df1=pd.DataFrame(jdbc_data,columns=["A1","B2","C3"]) db_df1.columns=columns db_df1.append(df_data) 多几行代码,不过2分钟就完成了dataframe的初始化动作,看来pandas自身的方式是需要优化的,不应该官方的方式对比常规方式有好几倍的性能差异的。

优秀的个人博客,低调大师

新增嵌入文档语义搜索,优化内置 UI 响应速度,无需依赖 Kibana,实现集群“开箱即管”

INFINI Easysearch 是一个分布式的搜索型数据库,实现非结构化数据检索、全文检索、向量检索、地理位置信息查询、组合索引查询、多语种支持、聚合分析等。Easysearch 可以完美替代 Elasticsearch,同时添加和完善多项企业级功能。Easysearch 助您拥有简洁、高效、易用的搜索体验。 Easysearch 本次更新如下: 💥 重大变更(Breaking Changes) 正式发布 Easysearch 2.0.2 版本,底层 Lucene 更新到 9.12.2 新增 ui 插件,为 Easysearch 提供了轻量级界面化管理功能,不再依赖第三方对集群进行管理,真正做到开箱即用 🚀 功能特性 (Features) 语义搜索新增支持 NestedQueryBuilder KNN mapping 的 L 和 k 参数支持大小写不敏感,提升易用性 ✈️ 改进优化 (Improvements) UI 插件静态文件支持 gzip 压缩,加快页面加载 优化了图标资源大小 调整了内部构建流程和 CSP 策略 🐛 问题修复(Bug Fixes) 修复了开发者工具的主题颜色显示问题 更多详情请查看以下 Easysearch 产品的 Release Notes 或联系我们的技术支持团队! INFINI Easysearch 期待反馈 欢迎下载体验使用,如果您在使用过程中遇到如何疑问或者问题,欢迎前往 INFINI Labs Github(https://github.com/infinilabs) 中的对应项目中提交 Feature Request 或提交 Bug。 下载地址:https://infinilabs.cn/download 邮件:hello@infini.ltd 电话:(+86) 400-139-9200 Discord:https://discord.gg/4tKTMkkvVX 也欢迎大家微信添加小助手(INFINI-Labs),加入用户群一起讨论交流。

优秀的个人博客,低调大师

诊断 Java 代码: 提高 Java 代码的性能 尾递归转换能加快应用程序的速度,但不是所有的 JVM 都会做这种转换

简介:很多算法用尾递归方法表示会显得格外简明。编译器会自动把这种方法转换成循环,以提高程序的性能。但在 Java 语言规范中,并没有要求一定要作这种转换,因此,并不是所有的 Java 虚拟机(JVM)都会做这种转换。这就意味着在 Java 语言中采用尾递归方法将导致巨大的内存占用,而这并不是我们期望的结果。Eric Allen 在本文中阐述了动态编译将会保持语言的语义,而静态编译则通常不会。他说明了为什么这是一个重要问题,并提供了一段代码来帮助判断您的即时(JIT)编译器是否会在保持语言语义的同时做尾递归代码转换。 尾递归及其转换 相当多的程序包含有循环,这些循环运行的时间占了程序总运行时间的很大一部分。这些循环经常要反复更新不止一个变量,而每个变量的更新又经常依赖于其它变量的值。 由于这一特点,在尾递归函数和循环之间有一个很好的对应关系:可以简单地把每个递归调用看作是一个循环的多次迭代。但因为所有可变的参数值都一次传给了递归调用,所以比起循环来,在尾递归中可以更容易地得到更新值。而且,难以使用的 break 语句也常常为函数的简单返回所替代。如果把迭代看成是尾递归函数,那么,就可以把这些变量看成是函数的参数。简单提醒一下:如果一个调用的返回值被作为调用函数的值立即返回,那么,这个递归调用就是尾递归;尾递归不必记住调用时调用函数的上下文。 但在 Java 编程中,用这种方式表示迭代将导致效率低下,因为大量的递归调用有导致堆栈溢出的危险。 解决方案比较简单:因为尾递归函数实际上只是编写循环的一种更简单的方式,所以就让编译器把它们自动转换成循环形式。这样您就同时利用了这两种形式的优点。 但是,尽管大家都熟知如何把一个尾递归函数自动转换成一个简单循环,Java 规范却不要求做这种转换。不作这种要求的原因大概是:通常在面向对象的语言中,这种转换不能静态地进行。相反地,这种从尾递归函数到简单循环的转换必须由 JIT 编译器动态地进行。 要理解为什么会是这样,考虑下面一个失败的尝试:在 Integers 集上,把 Iterator 中的元素相乘。 因为下面的程序中有一个错误,所以在运行时会抛出一个异常。但是,就象在本专栏以前的许多文章中已经论证的那样,一个程序抛出的精确异常(跟很棒的错误类型标识符一样)对于找到错误藏在程序的什么地方并没有什么帮助,我们也不想编译器以这种方式改变程序,以使编译的结果代码抛出一个不同的异常。 清单 1. 一个把Integer集的Iterator中的元素相乘的失败尝试 import java.util.Iterator; public class Example { public int product(Iterator i) { return productHelp(i, 0); } int productHelp(Iterator i, int accumulator) { if (i.hasNext()) { return productHelp(i, accumulator * ((Integer)i.next()).intValue()); } else { return accumulator; } } } 注意product方法中的错误。product方法通过把 accumulator 赋值为 0 调用productHelp。它的值应为 1。否则,在类Example的任何实例上调用product都将产生 0 值,不管 Iterator 是什么值。 假设这个错误终于被改正了,但同时,类Example的一个子类也被创建了,如清单 2 所示: 清单 2. 试图捕捉象清单 1 这样的不正确的调用 import java.util.*; class Example { public int product(Iterator i) { return productHelp(i, 1); } int productHelp(Iterator i, int accumulator) { if (i.hasNext()) { return productHelp(i, accumulator * ((Integer)i.next()).intValue()); } else { return accumulator; } } } // And, in a separate file: import java.util.*; public class Example2 extends Example { int productHelp(Iterator i, int accumulator) { if (accumulator < 1) { throw new RuntimeException("accumulator to productHelp must be >= 1"); } else { return super.productHelp(i, accumulator); } } public static void main(String[] args) { LinkedList l = new LinkedList(); l.add(new Integer(0)); new Example2().product(l.listIterator()); } } 类Example2中的被覆盖的productHelp方法试图通过当 accumulator 小于“1”时抛出运行时异常来捕捉对productHelp的不正确调用。不幸的是,这样做将引入一个新的错误。如果Iterator含有任何 0 值的实例,都将使productHelp在自身的递归调用上崩溃。 现在请注意,在类Example2的 main 方法中,创建了Example2的一个实例并调用了它的product方法。由于传给这个方法的Iterator包含一个 0,因此程序将崩溃。 然而,您可以看到类Example的productHelp是严格尾递归的。假设一个静态编译器想把这个方法的正文转换成一个循环,如清单 3 所示: 清单 3. 静态编译不会优化尾调用的一个示例 int productHelp(Iterator i, int accumulator) { while (i.hasNext()) { accumulator *= ((Integer)i.next()).intValue(); } return accumulator; } 于是,最初对productHelp的调用,结果成了对超类的方法的调用。超方法将通过简单地在 iterator 上循环来计算其结果。不会抛出任何异常。 用两个不同的静态编译器来编译这段代码,结果是一个会抛出异常,而另一个则不会,想想这是多么让人感到困惑。 回页首 您的 JIT 会做这种转换吗? 因此,如清单 3 中的示例所示,我们不能期望静态编译器会在保持语言语义的同时对 Java 代码执行尾递归转换。相反地,我们必须依靠 JIT 进行的动态编译。JIT 会不会做这种转换是取决于 JVM。 要判断您的 JIT 会否转换尾递归的一个办法是编译并运行如下小测试类: 清单 4. 判断您的 JIT 能否转换尾递归 public class TailRecursionTest { private static int loop(int i) { return loop(i); } public static void main(String[] args) { loop(0); } } 我们来考虑一下这个类的loop方法。这个方法只是尽可能长时间地对自身作递归调用。因为它永远不会返回,也不会以任何方式影响任何外部变量,因此如清单 5 所示替换其代码正文将保留程序的语义。 清单 5. 一个动态转换 public class TailRecursionTest { private static int loop(int i) { while (true) { } } public static void main(String[] args) { loop(0); } } 而且,事实上这也就是足够完善的编译器所做的转换。 如果您的 JIT 编译器把尾递归调用转换成迭代,这个程序将无限期地运行下去。它所需的内存很小,而且不会随时间增加。 另一方面,如果 JIT 不做这种转换,程序将会很快耗尽堆栈空间并报告一个堆栈溢出错误。 我在两个 Java SDK 上运行这个程序,结果令人惊讶。在 SUN 公司的 Hotspot JVM(版本 1.3 )上运行时,发现 Hotspot 不执行这种转换。缺省设置下,在我的机器上运行时,不到一秒钟堆栈空间就被耗尽了。 另一方面,程序在 IBM 的 JVM(版本 1.3 )上咕噜噜运行时却没有任何问题,这表明 IBM 的 JVM 以这种方式转换代码。 回页首 总结 记住:我们不能寄希望于我们的代码会总是运行在会转换尾递归调用的 JVM 上。因此,为了保证您的程序在所有 JVM 上都有适当的性能,您应始终努力把那些最自然地符合尾递归模式的代码按迭代风格编写。 但是请注意:就象我们的示例所演示的那样,以这种方式转换代码时很容易引入错误,不论是由人工还是由软件来完成这种转换。 参考资料 您可以参阅本文在 developerWorks 全球站点上的英文原文. 参与本专栏的讨论论坛。 欲了解Hotspot的更多信息,请参阅 SUN 的有关文档。 欲详细了解尾递归及其到迭代的转换,请参阅CMU Common Lisp User's Manual(CMU Common Lisp 用户手册)。虽然这本手册是(当然是)为 Common Lisp 写的,但其中关于尾递归的讨论也适用于其他语言,包括 Java 语言。 对提高您 Java 代码的性能有兴趣?在二月底于纽约召开的国际 Java 开发大会上,性能专家 Peter Haggar 在他的音频演示中讨论了这个问题的本质。 阅读 Eric 关于诊断 Java 代码的完整系列。 关于作者 Eric Allen 在 Cornell 大学获得了计算机科学及数学的学士学位。他目前是Cycorp,Inc的主要 Java 软件开发人员带头人,编程部的副经理,还是位于JavaWorld的 Java 初学者论坛的主持人。他还是 Rice 大学编程语言小组的兼职研究生。他的研究涉及在源程序和字节码层次上的正规语义模型和 Java 语言扩展的开发。目前,他正在为 NextGen 编程语言实现一种从源代码到字节码的编译器,这也是 Java 语言的泛型运行时类型的一种扩展。可通过eallen@cyc.com与 Eric 联系。 ============================================================================== 本文转自被遗忘的博客园博客,原文链接:http://www.cnblogs.com/rollenholt/articles/2193026.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

英伟达 CEO 黄仁勋解读人工智能:我们正活在科幻小说当中,AI 的发展速度将超越摩尔定律

编者按:本文发表于VentureBeat,作者Dean Takahashi,原标题《Forget about smart glasses … here come smart contact lenses》。由雷锋网编译,未经许可,不得转载。 上周,英伟达公布了 Q3 财报,震惊了华尔街。公司 Q3 营收为 20.04 亿美元,比去年同期的 13.05 亿美元增长 54%,比上季度的 14.28 亿美元增长 40 %。关于营收,此前 12 位分析师的预期为 16.80 亿美元,但新季度达到了 20.04 亿美元,超过了盈利预期。令雷锋网(公众号:雷锋网)惊叹的是,自今年以来,英伟达股价已上涨一倍有余,从市值 200 亿美元到如今市值 470 亿美元。 财报公布之后不久,美国科技博客 Venturebeat 的记者 Dean Taka

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册