性能:遍历除元素之外的数组

如何解决性能:遍历除元素之外的数组

| 我正在使用Ruby on Rails 3.0.7,我想遍历对象数组(类距离),但元素
id
等于
1
id
是指array [
1
]索引)。 我知道我可以对
each
语句使用
if
语句“内部”,并检查每个“当前” \“考虑”元素
if id == 1
。但是,由于数组中填充了大量数据,因此我想找到另一种方法,以便以更高性能的方式完成相同的事情(避免每次都运行
if
)。 我能怎么做?     

解决方法

        
a = [\'a\',\'b\',\'c\']
a.each_with_index.reject {|el,i| i == 1}.each do |el,i|
  # do whatever with the element
  puts el
end
IMHO是一种更好的选择方法,而不是使用您自己的显式
if
语句。但是,我相信它将产生与使用
if
相同的性能,甚至可能稍低一些。 如果像其他人建议的那样进行基准测试之后,您知道花费的时间肯定比您允许的时间慢,并且是导致缓慢的选择,那么可以很容易地通过多种方式修改此选择以删除选择:
a = [\'a\',\'c\']
n = 1
(a.first(n) + a.drop(n + 1)).each do |el|
  # do whatever with the element
  puts el
end
不幸的是,我相信这比运行简单的if还要慢。我认为可能具有提速潜力的一种是:
a = [\'a\',\'c\']
n = 1
((0...n).to_a+((n+1)...a.size).to_a).map{|i| a[i]}.each do |el|
  # do whatever with the element
  puts el
end
但这又很可能会变慢。 编辑 基准就是这个要点。这些结果实际上使我感到惊讶,拒绝是迄今为止最慢的选择,其次是范围。完全不删除元素之后的最高性能是使用
first
drop
选择周围的所有元素。 以未选择作为基准的百分比结果:
with if             146%
with first and drop 104%
without if          100%
显然,这在很大程度上取决于您对元素的处理方式,这是使用Ruby可以执行的最快操作进行的测试。操作越慢,这些差异就越小。一如既往:基准,基准,基准     ,         使程序生效 轮廓 优化 唐纳德·努斯说:   我们应该忘记小   效率,约占97%   时间:过早的优化是   万恶之源。 现在,您可以执行以下操作:
def f
  do_something
end

f 0
for i in 2..n
  f i
end
甚至:
def f
  yield 0
  for i in 2..@n
    yield i
  end
end

f do |i|
  do_something
end
但是您可能不想做任何事情,如果您做了,那只会在发现它很重要之后。 最后,假设这个丑陋的技巧实际上使您的服务器运行得更快。它值得吗?     ,        
if
语句是非常便宜的操作。您可以使用标准基准测试工具进行检查。
require \"benchmark\"

array = [1] * 100_000

Benchmark.bm do |bm|
  bm.report \"with if\" do
    array.each_with_index do |element,i|
      next if i == 1
      element - 1
    end
  end

  bm.report \"without if\" do
    array.each do |element|
      element - 1
    end
  end
end
结果:
                user     system      total        real
with if     0.020000   0.000000   0.020000 (  0.018115)
without if  0.010000   0.000000   0.010000 (  0.012248)
在100000个元素数组上,大约相差0.006秒。除非它成为瓶颈,否则您不应该关心它,我怀疑它会成为瓶颈。     ,        测试一个实际的for循环可能需要花费五分钟的时间。在Ruby圈子中可能对此并不满意,但这并不意味着它永远不值得使用。当您调用每个或地图或其他内容时,这些方法会以任何方式使用for循环。避免绝对。 这也取决于阵列可以得到多大,在大约n处,一个阵列可能变得比另一个阵列更快。在这种情况下,绝对不值得。 如果您不需要特定的元素,则可能不需要在数据库中存储该行数据。第1行与其余各行有什么区别,换句话说,为什么要跳过它? ID = 1的行中是否总是会有相同的数据?如果是这样,将其存储为常量可能会更好,并且会使您的问题无济于事。性能几乎总是会消耗更多的内存。 除非Rails 3所做的事情有所不同,并且您拉出数据并将id用作查找器键,否则id = 1将位于元素0中。 不幸的是,Knuth的报价被误解了很多,并习惯了糟糕的,低效的代码,如果程序员受过足够的教育,他们就不会编写这些代码,并思考了5秒钟。当然,花一个星期的时间尝试加速您不知道的代码是一个问题还是一个小问题,但这更多是Knuth所说的。性能是计算机科学中最容易被理解和滥用的概念之一。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-