生成两个非重复数字数组
Generate Two Arrays of Non-Duplicate Numbers
我有以下代码,它根据比率生成两个不重复的整数数组。这些代码工作完美,但对于 4000 行的文件,这需要一些时间。
//Train & Test numbers
int train = (int)(((double)Settings.Default.TrainingRatio / 100) * inputLines.Count());
int test = inputLines.Count() - train;
//Train & Test list
Random rnd = new Random();
var trainList = Enumerable.Range(1, inputLines.Count()).OrderBy(x => rnd.Next()).Take(train).ToList();
var testList = new List<int>();
for (int i = 1; i <= inputLines.Count(); i++)
{
if (!trainList.Contains(i))
testList.Add(i);
}
更糟糕的是,这就是我阅读这些行的方式:
foreach (var n in trainList)
{
objDataintilizer.GenerateMasterLableFile(inputLines.Skip(n - 1).Take(1).First().ToString());
}
谁能建议另一种性能更好的方法。
每次您的代码调用 inputFiles.Count()
,您实际上是在重新读取整个文件,因为 File.ReadLines
使用 延迟执行 ,并且您没有实现它。由于无论如何您都需要内存中的整个列表,因此请改用 File.ReadAllLines
,其中 returns 一个 string[]
并且有一个 Length
属性,这是一个 O( 1) 运算代替 O(N).
然后,不要为 trainList
使用 List<int>
,而是使用 HashSet<int>
,这样可以更快地使用 Contains
:
进行查找
public static class EnumerableExtensions
{
public static HashSet<T> ToHashSet(this IEnumerable<T> enumerable)
{
return new HashSet<T>(enumerable);
}
}
Random rnd = new Random();
var trainList = Enumerable.Range(1, inputLines.Length)
.OrderBy(x => rnd.Next())
.Take(train)
.ToHashSet();
var testList = new List<int>();
for (int i = 1; i <= inputLines.Length; i++)
{
if (!trainList.Contains(i))
testList.Add(i);
}
我有以下代码,它根据比率生成两个不重复的整数数组。这些代码工作完美,但对于 4000 行的文件,这需要一些时间。
//Train & Test numbers
int train = (int)(((double)Settings.Default.TrainingRatio / 100) * inputLines.Count());
int test = inputLines.Count() - train;
//Train & Test list
Random rnd = new Random();
var trainList = Enumerable.Range(1, inputLines.Count()).OrderBy(x => rnd.Next()).Take(train).ToList();
var testList = new List<int>();
for (int i = 1; i <= inputLines.Count(); i++)
{
if (!trainList.Contains(i))
testList.Add(i);
}
更糟糕的是,这就是我阅读这些行的方式:
foreach (var n in trainList)
{
objDataintilizer.GenerateMasterLableFile(inputLines.Skip(n - 1).Take(1).First().ToString());
}
谁能建议另一种性能更好的方法。
每次您的代码调用 inputFiles.Count()
,您实际上是在重新读取整个文件,因为 File.ReadLines
使用 延迟执行 ,并且您没有实现它。由于无论如何您都需要内存中的整个列表,因此请改用 File.ReadAllLines
,其中 returns 一个 string[]
并且有一个 Length
属性,这是一个 O( 1) 运算代替 O(N).
然后,不要为 trainList
使用 List<int>
,而是使用 HashSet<int>
,这样可以更快地使用 Contains
:
public static class EnumerableExtensions
{
public static HashSet<T> ToHashSet(this IEnumerable<T> enumerable)
{
return new HashSet<T>(enumerable);
}
}
Random rnd = new Random();
var trainList = Enumerable.Range(1, inputLines.Length)
.OrderBy(x => rnd.Next())
.Take(train)
.ToHashSet();
var testList = new List<int>();
for (int i = 1; i <= inputLines.Length; i++)
{
if (!trainList.Contains(i))
testList.Add(i);
}