簡體   English   中英

從Jython調用重載的Java方法

[英]Calling an overloaded Java method from Jython

當我從Jython腳本調用重載的Java方法時,我看到了一些我不理解的奇怪行為。

這是我的Java類:

public class TestClass {
  public static float[][][] overloaded(float[][][] x) {
    return x;
  }
  public static float[][][][] overloaded(float[][][][] x) {
    return x;
  }
  public static float[][][] zeros(int n1, int n2, int n3) {
    return new float[n3][n2][n1];
  }
}

這是我的Jython腳本:

import time,TestClass
n1,n2,n3 = 250,250,250
z = TestClass.zeros(n1,n2,n3)
start = time.time()
TestClass.overloaded([z,z,z])
print 'time =',(time.time()-start)

這個Jython腳本大約需要1分鍾才能運行,但如果我在TestClass中注釋掉第一個方法,那么腳本幾乎不需要任何時間。 我很困惑為什么在方法重載時需要這么長時間。 我在這里錯過了什么嗎?

你的守則!!

import time,TestClass
n1,n2,n3 = 250,250,250
z = TestClass.zeros(n1,n2,n3)
start = time.time()
TestClass.overloaded([z,z,z])
print 'time =',(time.time()-start)

事實!!

  1. Jython是基於Java的(我們已經知道!!)
  2. 當你執行n1,n2,n3 = 250,250,250並且說z = TestClass.zeros(n1,n2,n3)基本上你要分配大約500000000 bytes477 megabytes 500000000 bytes 250x250x250x32 bytes 其中 32是Java中float的大小。
  3. 當你說TestClass.overloaded([z,z,z])你總是會調用4維重載方法! 如果你不相信我,試試吧!!

我的代碼工作得很好!!

我剛剛將TestClass.overloaded([z,z,z])更改為x = TestClass.overloaded([z,z,z]) 執行速度非常快。 但在打印'x'時 it still fails!! 為什么?!

'為什么'部分!

它失敗是因為當你執行TestClass.overloaded([z,z,z])或者我打印'x'因為python或者更確切地說jython需要在字符串表示中轉換對象而這就是問題所在。 請參閱下面的堆棧跟蹤:

java.lang.OutOfMemoryError: Java heap space
        at java.util.Arrays.copyOfRange(Arrays.java:3209)
        at java.lang.String.<init>(String.java:215)
        at java.lang.StringBuilder.toString(StringBuilder.java:430)
        at org.python.core.PyList.list_toString(PyList.java:472)
        at org.python.core.PyList.toString(PyList.java:450)
        at org.python.core.PyArray.toString(PyArray.java:395)
        at org.python.core.PyObject.__repr__(PyObject.java:174)
        at org.python.core.PyList.list_toString(PyList.java:464)
        at org.python.core.PyList.toString(PyList.java:450)
        at org.python.core.PyArray.toString(PyArray.java:395)
        at org.python.core.PyObject.__repr__(PyObject.java:174)

看.. JVM遭到轟炸!!!! 它沒有堆空間......即使你改變了內存的JVM參數並用更多的祝福這個程序,即使那時你談論的是478 MB !! (當然這不只是478 MB ,因為你正在傳遞的數組'z'和他們每個人是478 MB !),而且只是你分配什么,除此之外JVM將需要記憶的StringBuilder保存字符串表示和其他一些東西!!

相信我需要時間和大量的時間。

只是為了給你一些感覺!!

>>> n1,n2,n3 = 2,2,2
>>> z = TestClass.zeros(n1,n2,n3)
>>> x = TestClass.overloaded([z,z,z])
>>> x

Output:

array([[[F, [array([[F, [array([F, [array('f', [0.0, 0.0]), array('f', [0.0, 0.0
])]), array([F, [array('f', [0.0, 0.0]), array('f', [0.0, 0.0])])]), array([[F,
[array([F, [array('f', [0.0, 0.0]), array('f', [0.0, 0.0])]), array([F, [array('
f', [0.0, 0.0]), array('f', [0.0, 0.0])])]), array([[F, [array([F, [array('f', [
0.0, 0.0]), array('f', [0.0, 0.0])]), array([F, [array('f', [0.0, 0.0]), array('
f', [0.0, 0.0])])])])

查看字符串的大小,它只適用於2x2x2x32 bytes的數組!! 拿我用過的代碼,然后用20's改變所有的2's

但是為什么在沒有取消注釋第一種方法時需要時間!

記住為了解決糾正重載函數的問題,jython需要評估[z,z,z]哪個內存量很大。 這就是你看到延遲的地方。 當您對第一種方法發表評論時,對該調用沒有任何混淆,因此它會立即返回。 如果我使用你的代碼,那么它首先需要解決上面提到的表達式, 然后計算對象的字符串表示。 結合起來,需要很長時間才能再次響應。 但是,如果我使用代碼的修改版本,即x = TestClass.overloaded([z,z,z])那么它會變得有點快,但仍然需要花時間打印'x'或者可能導致Heap Exception

玩得開心 !!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM